我正在使用Python机器学习'来学习机器学习。塞巴斯蒂安拉施卡写的书。
我的问题是关于scikit-learn Perceptron Class的学习率eta0。 在该书中使用Perceptron为Iris数据分类器实现了以下代码。
(...省略...)
from sklearn import datasets
from sklearn.linear_model import Perceptron
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
ml = Perceptron(eta0=0.1, n_iter=40, random_state=0)
ml.fit(X_train_std, y_train)
y_pred = ml.predict(X_test_std)
print('total test:%d, errors:%d' %(len(y_test), (y_test != y_pred).sum()))
print('accuracy: %.2f' %accuracy_score(y_test, y_pred))
我的问题如下。 对于各种eta0值,结果(总测试,误差,准确度)不会改变。
"总测试= 45,错误= 4,准确度= 0.91' eta0 = 0.1和eta0 = 100都出局了。 什么是错的?
答案 0 :(得分:1)
我将尝试简要解释Perceptron中学习率的位置,以便了解为什么最终误差幅度与准确度得分之间没有差异。
Perceptron的算法总是找到一个解决方案,前提是我们定义了有限数量的时期(即迭代或步骤),无论有多大 eta0 ,因为这个常数只是乘以输出权重在装修期间。
其他实现中的学习率(如神经网络和其他所有其他*)是在达到最佳最小值的过程中乘以给定函数的偏导数的值。虽然较高的学习率使我们有更高的机会超越最优,但较低的学习率会消耗更多的时间来收敛(达到最佳点)。这个理论很复杂,但是有一个很好的主题描述你应该阅读的学习率:
http://neuralnetworksanddeeplearning.com/chap3.html
好的,现在我还将向您展示Perceptron中的学习率仅用于重新调整权重。让我们将 X 视为我们的列车数据,将 y 视为我们的列车标签。让我们尝试将Perceptron与两个不同的 eta0 相匹配,比如1.0和100.0:
X = [[1,2,3], [4,5,6], [1,2,3]]
y = [1, 0, 1]
clf = Perceptron(eta0=1.0, n_iter=5)
clf.fit(X, y)
clf.coef_ # returns weights assigned to the input features
array([[ - 5。, - 。,。。]])
clf = Perceptron(eta0=100.0, n_iter=5)
clf.fit(X, y)
clf.coef_
array([[ - 500。,-100。,300。]])
正如您所看到的,Perceptron中的学习率仅重新调整模型的权重(保持符号不变),同时保留准确度分数和误差项不变。
希望足够。即