关于scikit-learn Perceptron学习率

时间:2017-06-23 05:09:39

标签: python scikit-learn perceptron

我正在使用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都出局了。 什么是错的?

1 个答案:

答案 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中的学习率仅重新调整模型的权重(保持符号不变),同时保留准确度分数和误差项不变。

希望足够。即