公众号:尤而小屋
作者:Peter
编辑:Peter
大家好,我是Peter~
Scikit-learn是一个非常知名的Python机器学习库,它广泛地用于统计分析和机器学习建模等数据科学领域。
本篇文章通过简明快要的方式来介绍scikit-learn的使用,更多详细内容请参考官网:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhHDPA0W-1642000510110)(https://tva1.sinaimg.cn/large/008i3skNly1gy91kiv4ioj30q206idgn.jpg)]
下面这张图是官网提供的,从样本量的大小开始,分为回归、分类、聚类、数据降维共4个方面总结了scikit-learn的使用:
https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-282zsYxN-1642000510115)(https://tva1.sinaimg.cn/large/008i3skNly1gy8xqnswgej31c40u0afu.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSRvRlDE-1642000510115)(https://tva1.sinaimg.cn/large/008i3skNly1gy927cm155j313d0u0qav.jpg)]
关于安装scikit-learn,建议通过使用anaconda来进行安装,不用担心各种配置和环境问题。当然也可以直接pip来安装:
pip install scikit-learn
sklearn内置了一些优秀的数据集,比如:Iris数据、房价数据、泰坦尼克数据等。
import pandas as pd
import numpy as np
import sklearn
from sklearn import datasets # 导入数据集
# iris数据
iris = datasets.load_iris()
type(iris)
sklearn.utils.Bunch
iris数据到底是什么样子?每个内置的数据都存在很多的信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKRG6QrN-1642000510116)(https://tva1.sinaimg.cn/large/008i3skNly1gy91n9pteoj30rm0megni.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gecPp4v-1642000510121)(https://tva1.sinaimg.cn/large/008i3skNly1gy91nwfg6oj31k60pc12z.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kOXvOKmu-1642000510121)(https://tva1.sinaimg.cn/large/008i3skNly1gy91offvk6j31jm09qacu.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2RTObAG-1642000510123)(https://tva1.sinaimg.cn/large/008i3skNly1gy91posqcij316e0ogjus.jpg)]
可以将上面的数据生成我们想看到的DataFrame,还可以添加因变量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3LKCaCW-1642000510123)(https://tva1.sinaimg.cn/large/008i3skNly1gy91q8nb2xj310k0qeq55.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dUQ8uGK-1642000510124)(https://tva1.sinaimg.cn/large/008i3skNly1gy91qs9ryrj31640qawgw.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7quU7oC-1642000510124)(https://tva1.sinaimg.cn/large/008i3skNly1gy91s2w95wj31ak0pqdlw.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ee7qBKU-1642000510125)(https://tva1.sinaimg.cn/large/008i3skNly1gy91t3mq61j31ky0oswqu.jpg)]
我们重点关注的属性:
同样可以生成DataFrame:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZvGcvlw-1642000510126)(https://tva1.sinaimg.cn/large/008i3skNly1gy91uej0edj31fc0s80yg.jpg)]
方式1
#调用模块
from sklearn.datasets import load_iris
data = load_iris()
#导入数据和标签
data_X = data.data
data_y = data.target
方式2
from sklearn import datasets
loaded_data = datasets.load_iris() # 导入数据集的属性
#导入样本数据
data_X = loaded_data.data
# 导入标签
data_y = loaded_data.target
方式3
# 直接返回
data_X, data_y = load_iris(return_X_y=True)
from sklearn import datasets # 导入库
boston = datasets.load_boston() # 导入波士顿房价数据
print(boston.keys()) # 查看键(属性) ['data','target','feature_names','DESCR', 'filename']
print(boston.data.shape,boston.target.shape) # 查看数据的形状
print(boston.feature_names) # 查看有哪些特征
print(boston.DESCR) # described 数据集描述信息
print(boston.filename) # 文件路径
# 导入模块
from sklearn.model_selection import train_test_split
# 划分为训练集和测试集数据
X_train, X_test, y_train, y_test = train_test_split(
data_X,
data_y,
test_size=0.2,
random_state=111
)
# 150*0.8=120
len(X_train)
from sklearn.preprocessing import StandardScaler # 标准化
from sklearn.preprocessing import MinMaxScaler # 归一化
# 标准化
ss = StandardScaler()
X_scaled = ss.fit_transform(X_train) # 传入待标准化的数据
# 归一化
mm = MinMaxScaler()
X_scaled = mm.fit_transform(X_train)
来自官网案例:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTLfiYwG-1642000510127)(https://tva1.sinaimg.cn/large/008i3skNly1gy91ym3xtmj310m0ki419.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLR8wcpO-1642000510129)(https://tva1.sinaimg.cn/large/008i3skNly1gy9202euv9j313q0g8dia.jpg)]
from sklearn.neighbors import KNeighborsClassifier, NeighborhoodComponentsAnalysis # 模型
from sklearn.datasets import load_iris # 导入数据
from sklearn.model_selection import train_test_split # 切分数据
from sklearn.model_selection import GridSearchCV # 网格搜索
from sklearn.pipeline import Pipeline # 流水线管道操作
from sklearn.metrics import accuracy_score # 得分验证
# 模型实例化
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
KNeighborsClassifier()
y_pred = knn.predict(X_test)
y_pred # 基于模型的预测值
array([0, 0, 2, 2, 1, 0, 0, 2, 2, 1, 2, 0, 1, 2, 2, 0, 2, 1, 0, 2, 1, 2,
1, 1, 2, 0, 0, 2, 0, 2])
模型得分验证的两种方式:
knn.score(X_test,y_test)
0.9333333333333333
accuracy_score(y_pred,y_test)
0.9333333333333333
from sklearn.model_selection import GridSearchCV
# 搜索的参数
knn_paras = {"n_neighbors":[1,3,5,7]}
# 默认的模型
knn_grid = KNeighborsClassifier()
# 网格搜索的实例化对象
grid_search = GridSearchCV(
knn_grid,
knn_paras,
cv=10 # 10折交叉验证
)
grid_search.fit(X_train, y_train)
GridSearchCV(cv=10, estimator=KNeighborsClassifier(),
param_grid={'n_neighbors': [1, 3, 5, 7]})
# 通过搜索找到的最好参数值
grid_search.best_estimator_
KNeighborsClassifier(n_neighbors=7)
grid_search.best_params_
Out[42]:
{'n_neighbors': 7}
grid_search.best_score_
0.975
knn1 = KNeighborsClassifier(n_neighbors=7)
knn1.fit(X_train, y_train)
KNeighborsClassifier(n_neighbors=7)
通过下面的结果可以看到:网格搜索之后的建模效果是优于未使用网格搜索的模型
y_pred_1 = knn1.predict(X_test)
knn1.score(X_test,y_test)
1.0
accuracy_score(y_pred_1,y_test)
1.0