初识scikit-learn
scikit-learn是python的一个用于机器学习的第三方库,可以通过pip安装:
pip install -U scikit-learn
其内部含有特定的数据集:
from sklearn.datasets import load_iris
这里导入的是一个鸢尾花数据集,它能生成有关花朵特征的值(如花瓣长度、叶片直径等),我们可以设定它的返回值格式:
X, y = load_iris(return_X_y=True)
这里的returh_X_y是关键字参数,设置为True时,返回的格式会分为
X:鸢尾花的特征值,共150条,每条包含四个值,维度为(150, 4)
y:目标数据,即这四个特征值所对应的是否是鸢尾花,维度为(150, )
由此可以看到,我们采用有监督学习来训练,接下来我们对数据集进行分割,分为训练数据和测试数据
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.2, random_state=25)
train_test_split方法用于分割数据集,其中
- X, y是我们要分割的数据集
- test_size或者train_size指代的是分割出来的比例,二者互补
- random_state在这里充当一个随机种子角色,即相同的random_state所运行的结果是一样的,反之则不同,这通常在需要对结果复现时用到
方法的返回值如变量名所示,由于test_size=0.2,因此这里的train相对于test是0.8 :0.2,也就是四比一的关系
接下来我们采用knn算法来对数据集进行训练,首先确定一个K值:
from sklearn.neighbors import KNeighborsClassifier k = 5 model = KNeighborsClassifier(n_neighbors=k)
k值为5,也就是说选取目标周围5个最近的值来进行判断,这里利用sklearn的KNeighborsClassifier来完成,得到了model,我们的训练模型。随后开始训练:
model.fit(Xtrain, Ytrain)
完成后,我们可以测试一下我们的训练成果如何。使用刚刚划分的test数据进行验证:
accuracy = model.score(Xtest, Ytest) print(f"accuracy with k={k} is {accuracy}")
得到的输出结果为:

需要注意的是model.score(Xtest, Ytest)并没有用到Xtrain和Ytrain,也就是说它看起来是已经吸收了Xtrain和Ytrain用于提升自身的预测准确率,但是实际在执行这一步时仍然会使用到之前的Xtrain和Ytrain。
因为knn采用的是惰性学习(lazy learning),它将训练的数据集存储起来,用于之后比对。如果在这里提前删除Xtrain, Ytrain的话,模型引用不到数据(除非保存了副本),那么这行代码会出现错误
这说明我们的模型预测准确率达到了93.3%。由于我们的K值是手动指定的,因此之后可以通过优化参数来提高正确率。
浙公网安备 33010602011771号