应用lbfgs的sklearn神经网络
应用lbfgs的sklearn神经网络
本文部分来自/sklearn/neural_network/tests/test_mlp.py,导入必要的库,并加载数据集。
from sklearn.neural_network import MLPClassifier, MLPRegressor
from sklearn.datasets import (load_digits,load_iris,make_regression,make_multilabel_classification
)
from sklearn.preprocessing import MinMaxScaler, scale
from sklearn.utils._testing import (assert_allclose,assert_array_equal,
)
import numpy as np
ACTIVATION_TYPES = ["identity", "logistic", "tanh", "relu"]X_digits, y_digits = load_digits(n_class=3, return_X_y=True)X_digits_multi = MinMaxScaler().fit_transform(X_digits[:200])
y_digits_multi = y_digits[:200]X_digits, y_digits = load_digits(n_class=2, return_X_y=True)X_digits_binary = MinMaxScaler().fit_transform(X_digits[:200])
y_digits_binary = y_digits[:200]X_reg, y_reg = make_regression(n_samples=200, n_features=10, bias=20.0, noise=100.0, random_state=7
)
y_reg = scale(y_reg)iris = load_iris()
X_iris = iris.data
y_iris = iris.target
测试lbfgs分类
def test_lbfgs_classification(X, y):# Test lbfgs on classification.# It should achieve a score higher than 0.95 for the binary and multi-class# versions of the digits dataset.X_train = X[:150]y_train = y[:150]X_test = X[150:]expected_shape_dtype = (X_test.shape[0], y_train.dtype.kind)for activation in ACTIVATION_TYPES:mlp = MLPClassifier(solver="lbfgs",hidden_layer_sizes=50,max_iter=150,shuffle=True,random_state=1,activation=activation,)mlp.fit(X_train, y_train)y_predict = mlp.predict(X_test)assert mlp.score(X_train, y_train) > 0.95assert (y_predict.shape[0], y_predict.dtype.kind) == expected_shape_dtype
测试lbfgs回归
def test_lbfgs_regression(X, y):# Test lbfgs on the regression dataset.for activation in ACTIVATION_TYPES:mlp = MLPRegressor(solver="lbfgs",hidden_layer_sizes=50,max_iter=200,tol=1e-3,shuffle=True,random_state=1,activation=activation,)mlp.fit(X, y)if activation == "identity":assert mlp.score(X, y) > 0.80else:# Non linear models perform much better than linear bottleneck:assert mlp.score(X, y) > 0.98
测试多标签分类
def test_multilabel_classification():# Test that multi-label classification works as expected.# test fit methodX, y = make_multilabel_classification(n_samples=50, random_state=0, return_indicator=True)mlp = MLPClassifier(solver="lbfgs",hidden_layer_sizes=50,alpha=1e-5,max_iter=150,random_state=0,activation="logistic",learning_rate_init=0.2,)mlp.fit(X, y)assert mlp.score(X, y) > 0.97
测试多输出回归
def test_multioutput_regression():# Test that multi-output regression works as expectedX, y = make_regression(n_samples=200, n_targets=5, random_state=11)mlp = MLPRegressor(solver="lbfgs", hidden_layer_sizes=50, max_iter=200, tol=1e-2, random_state=1)mlp.fit(X, y)assert mlp.score(X, y) > 0.9
测试预测多标签的概率
def test_predict_proba_multilabel():# Test that predict_proba works as expected for multilabel.# Multilabel should not use softmax which makes probabilities sum to 1X, Y = make_multilabel_classification(n_samples=50, random_state=0, return_indicator=True)n_samples, n_classes = Y.shapeclf = MLPClassifier(solver="lbfgs", hidden_layer_sizes=30, random_state=0)clf.fit(X, Y)y_proba = clf.predict_proba(X)assert y_proba.shape == (n_samples, n_classes)assert_array_equal(y_proba > 0.5, Y)y_log_proba = clf.predict_log_proba(X)proba_max = y_proba.argmax(axis=1)proba_log_max = y_log_proba.argmax(axis=1)assert (y_proba.sum(1) - 1).dot(y_proba.sum(1) - 1) > 1e-10assert_array_equal(proba_max, proba_log_max)assert_allclose(y_log_proba, np.log(y_proba))
运行测试函数
test_lbfgs_classification(X_digits_multi, y_digits_multi)
test_lbfgs_classification(X_digits_binary, y_digits_binary)
test_lbfgs_regression(X_reg, y_reg)
test_multilabel_classification()
test_multioutput_regression()
test_predict_proba_multilabel()