接上一篇:python机器学习基础教程(一)
一,构建第一个模型:
K近邻算法scikit-learn中有很多可用的分类算法。这里我们用的是K近邻分类器,这是一个很容易理解的算法。核心思想是:要对一个新的数据点作出预测,算法会在训练集中寻找与这个新数据点距离最近的数据点,然后将找到的数据点的标签赋值给这个新数据点。
K近邻算法中K的含义是,我们可以考虑训练期中与数据点最近的任意K个近邻,比如说距离最近的3个或5个邻居,而不是只考虑最近的那一个,然后我们可以用这些邻居中数据数量最多的类别作出预测,后面我会进一步介绍这个算法的细节,现在我们只考虑一个邻居的情况。
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsclassifier(n_neighbors=1)
knn对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测算法。他还包括算法从训练数据中提取的信息,对于KNeighborsClassifier来说里面只保存了训练集。
想要基于训练集来构建模型,需要调用knn对象fit方法,输入参数为X_train和y_train,二者都是numpy数组,前者包含训练集后者包含训练集标签。
knn.fit(X_train,y_train)
可以看到上面的输出结果是fit方法返回的knn对象本身,可以看到构建模型时用到的参数。几乎所有参数都是默认值,但你也会注意到n_neighbors=1是我们传入的参数。
二,做出预测
现在我们就可以用这个模型对新数据进行预测了。想象一下假如我们在野外发现了一朵莺尾花,花萼长5cm宽2.9cm,花瓣长1cm宽0.2cm,这朵莺尾花属于哪个品种?我们可以将这些数据放入Numpy数组中再次计算形状,数组形状为样本数(1)乘以特征数(4):
X_new=np.arry([[5, 2.9, 1, 0.2]])
print ("X_new.shape: {}".format(X_new.shape))
注意:我们将这多朵花的数据转换成二位Numpy数组的一行,因为scikit-learn的输入数据必须是二维数组。
prediction=knn.predict(x_new)
print("prediction :{}".format(prediction))
print("predicted target name:{}".format(iris_dataset["target_names"][prediction]))
根据我们模型的预测,这朵花属于类别0,也就是说它属于setosa品种。但我们能否信这个模型呢?这也是我们构建模型的重点。
三,评估模型
这里需要用到之前的测试集,这些数据没有用来构建模型,但我们知道测试集每朵花属于哪个品种。
因此,我们可以对测试集每朵花进行预测,然后将预测结果对比标签,通过计算精度来评估模型的优劣。精度就是品种预测正确的话所占的比例。
#模型预测
y_pred=knn.predict(x_test)
print("prediction :\n {}".format(y_pred))
print ("test set score:{:.2f}".format(np.mean(y_pred==y_test)))
我们还可以用knn对象的score方法来计算测试集的精度:
print ("test set score :{:.2f}".format(knn.score(x_test,y_test)))
对于这个模型来说,测试集的精度为0.97,也就是说我们对测试集中的莺尾花的预测,有97%是正确的。对于新的莺尾花可以认为我们的模型预测结果有97%是正确的。后面我们将讨论提高模型性能的方法,以及模型调参时应注意的事项。