code: def _generate_linear_dataset(self, nfeatures, nlabels, nsamples):
      tf.random.set_seed(1)
      seed_stream = test_util.test_seed_stream()
      data = tf.random.normal((nsamples, nfeatures), seed=seed_stream())
      weights = tf.random.normal(
          (nfeatures, nlabels), seed=seed_stream()
      )
      bias = tf.random.normal((nlabels,), seed=seed_stream())
  
      logits_true = tf.matmul(data, weights) + tf.expand_dims(bias, 0)
      prob_true = categorical.Categorical(logits=logits_true)
      labels = prob_true.sample(1, seed=seed_stream())
      labels = tf.reshape(labels, (tf.size(labels),))
  
      return data, labels, weights, bias
  
imports: import itertools
  from absl import logging
  from absl.testing import parameterized
  import numpy
  import tensorflow.compat.v2
  from tensorflow_probability.python.distributions import categorical
  from tensorflow_probability.python.internal import test_util
  from tensorflow_probability.python.stats import calibration
label_desc: Use image node_id 4 for calling the CalibrationTest obj's underlying member method code with example usage: obj._generate_linear_dataset(nfeatures, nlabels, nsamples) and returns: data,  labels,  weights,  bias