初识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值是手动指定的,因此之后可以通过优化参数来提高正确率。

posted @ 2025-05-01 22:32  蜂蜜蛋糕葡萄酒  阅读(43)  评论(0)    收藏  举报