训练二元分类器
现在先简化问题,只尝试识别一个数字,比如数字5。那么这个“数字5检测器”就是一个二元分类器的示例,它只能区分两个类别:5和非5。为此分类任务创建目标向量:
由于y是字符串数组
先要对y数据类型处理,便于后续的分类处理:
y = y.astype(np.uint8)
将y中的值转变为[0,255]区间的整数。
创建测试集和训练集。
由于X数组里面的数据本身就无规律,因此不需要随机取样。
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) # 得到一个布尔数组
y_test_5 = (y_test == 5)
接着挑选一个分类器并开始训练。一个好的初始选择是随机梯度下降(SGD)分类器,使用Scikit_Learn 的SGDClassifier类即可。这个分类器的优势是能够有效处理非常大型的数据集。这部分是因为SGD独立处理训练实例,一次一个(这也使得SGD非常适合在线学习),稍后我们将会看到。此时先创建一个SGDClassifier并在整个训练集上进行训练。
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(max_iter=1000, tol=1e-3, random_state=42)
#表示迭代1000次 误差为1e-3
sgd_clf.fit(X_train, y_train_5)
试试结果如何:
for i in range(20):
print(sgd_clf.predict(pd.DataFrame([X.loc[i,:]])))
结果如下:
[ True]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
[ True]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
[False]
结果表示第一个和第十二个数是5,果真如此吗?
print(y[0],y[11])
# 5 5
结果非常正确!