def test_multinomial_loss(): # test if the multinomial loss and gradient computations are consistent X, y = iris.data, iris.target.astype(np.float64) n_samples, n_features = X.shape n_classes = len(np.unique(y)) rng = check_random_state(42) weights = rng.randn(n_features, n_classes) intercept = rng.randn(n_classes) sample_weights = rng.randn(n_samples) np.abs(sample_weights, sample_weights) # compute loss and gradient like in multinomial SAG dataset, _ = make_dataset(X, y, sample_weights, random_state=42) loss_1, grad_1 = _multinomial_grad_loss_all_samples( dataset, weights, intercept, n_samples, n_features, n_classes) # compute loss and gradient like in multinomial LogisticRegression loss = LinearModelLoss( base_loss=HalfMultinomialLoss(n_classes=n_classes), fit_intercept=True, ) weights_intercept = np.vstack((weights, intercept)).T loss_2, grad_2 = loss.loss_gradient(weights_intercept, X, y, l2_reg_strength=0.0, sample_weight=sample_weights) grad_2 = grad_2[:, :-1].T # comparison assert_array_almost_equal(grad_1, grad_2) assert_almost_equal(loss_1, loss_2)
def test_multinomial_loss(): # test if the multinomial loss and gradient computations are consistent X, y = iris.data, iris.target.astype(np.float64) n_samples, n_features = X.shape n_classes = len(np.unique(y)) rng = check_random_state(42) weights = rng.randn(n_features, n_classes) intercept = rng.randn(n_classes) sample_weights = rng.randn(n_samples) np.abs(sample_weights, sample_weights) # compute loss and gradient like in multinomial SAG dataset, _ = make_dataset(X, y, sample_weights, random_state=42) loss_1, grad_1 = _multinomial_grad_loss_all_samples( dataset, weights, intercept, n_samples, n_features, n_classes) # compute loss and gradient like in multinomial LogisticRegression lbin = LabelBinarizer() Y_bin = lbin.fit_transform(y) weights_intercept = np.vstack((weights, intercept)).T.ravel() loss_2, grad_2, _ = _multinomial_loss_grad(weights_intercept, X, Y_bin, 0.0, sample_weights) grad_2 = grad_2.reshape(n_classes, -1) grad_2 = grad_2[:, :-1].T # comparison assert_array_almost_equal(grad_1, grad_2) assert_almost_equal(loss_1, loss_2)
def test_fused_types_make_dataset(): iris = load_iris() X_32 = iris.data.astype(np.float32) y_32 = iris.target.astype(np.float32) X_csr_32 = sparse.csr_matrix(X_32) sample_weight_32 = np.arange(y_32.size, dtype=np.float32) X_64 = iris.data.astype(np.float64) y_64 = iris.target.astype(np.float64) X_csr_64 = sparse.csr_matrix(X_64) sample_weight_64 = np.arange(y_64.size, dtype=np.float64) # array dataset_32, _ = make_dataset(X_32, y_32, sample_weight_32) dataset_64, _ = make_dataset(X_64, y_64, sample_weight_64) xi_32, yi_32, _, _ = dataset_32._next_py() xi_64, yi_64, _, _ = dataset_64._next_py() xi_data_32, _, _ = xi_32 xi_data_64, _, _ = xi_64 assert xi_data_32.dtype == np.float32 assert xi_data_64.dtype == np.float64 assert_allclose(yi_64, yi_32, rtol=rtol) # csr datasetcsr_32, _ = make_dataset(X_csr_32, y_32, sample_weight_32) datasetcsr_64, _ = make_dataset(X_csr_64, y_64, sample_weight_64) xicsr_32, yicsr_32, _, _ = datasetcsr_32._next_py() xicsr_64, yicsr_64, _, _ = datasetcsr_64._next_py() xicsr_data_32, _, _ = xicsr_32 xicsr_data_64, _, _ = xicsr_64 assert xicsr_data_32.dtype == np.float32 assert xicsr_data_64.dtype == np.float64 assert_allclose(xicsr_data_64, xicsr_data_32, rtol=rtol) assert_allclose(yicsr_64, yicsr_32, rtol=rtol) assert_array_equal(xi_data_32, xicsr_data_32) assert_array_equal(xi_data_64, xicsr_data_64) assert_array_equal(yi_32, yicsr_32) assert_array_equal(yi_64, yicsr_64)