python之Scikit-learn章节
目录
一、安装与导入
二、scikit-learn的使用
2.1 数据集导入
2.2 数据集切分
2.3 数值数据的标准化
2.3.1 数据归一化
2.3.2 数据的标准化
2.4 核心对象类型:评估器(estimator)
2.5 高级特性——管道
2.6 模型保存
2.7 监督学习算法
2.7.1 回归
2.7.2 分类
2.8 无监督学习算法
2.8.1 聚类算法
2.8.1 降维算法
2.9 评价指标
2.10 交叉验证及超参数调优
2.10.1 交叉验证
1)交叉验证的定义?
2)交叉验证的案例
3)代码实现
4)K折交叉验证对模型的优势
2.10.2 超参数调优
1)超参数定义
2)网格搜索
3)随机搜索
Scikit-learn是数据挖掘和数据分析的高效工具,可以实现数据预处理、分类、回归、降维、模型选择等操作。
一、安装与导入
pip install -U scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
Scikit-learn提供了非常多的内置数据集,且提供了一些创建数据集的方法,分为小规模的数据集和大规模的真是数据集。例如:iris鸢尾花数据集
- Iris(鸢尾花):一个分类问题的数据集,包含了三种鸢尾花的四个特征,目标是根据这些特征预测鸢尾花的种类。
from sklearn.datasets import load_irisiris = load_iris()
二、scikit-learn的使用
2.1 数据集导入
# 数据集特征矩阵
iris.data
# 数据集标签数组
iris.target
# 数据集包含四个特征
iris.feature_names
# 数据集有三种分类标签
iris.target_names
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head()
2.2 数据集切分
在scikit-learn中,需要将数据集分成训练集和测试集,为了评估模型的性能,通常使用train_test_split函数进行切分
from sklearn.model_selection import train_test_splitX = iris_df.drop(columns=['label'])
y = iris_df['label']# X, y代表切分数据,test_size代表测试集比例,random_state代表随机种子,确保每次运行切分方式一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train
X_test
y_train
y_test
2.3 数值数据的标准化
Scikit-learn中的预处理模块sklearn.preprocessing
提供了许多实用的特征缩放功能,如归一化、标准化。
2.3.1 数据归一化
将数据缩放到[0,1]的范围,或者[-1,1],使用MinMaxScaler实现
from sklearn.preprocessing import MinMaxScalerX = np.arange(30).reshape(5,6)
X_train, X_test = train_test_split(X)
scaler = MinMaxScaler() # 创建对象
X_train_normalized = scaler.fit_transform(X_train) # 对训练集数据进行拟合和转换
X_test_normalized = scaler.transform(X_test) # 对测试集数据进行转换
X_test_normalized
2.3.2 数据的标准化
将数据缩放,使得它们的均值为0,标准差为1。使用StandardScaler实现
from sklearn.preprocessing import StandardScalerX = np.arange(30).reshape(5,6)
X_train, X_test = train_test_split(X)
scaler = StandardScaler() # 创建对象
X_train_standardized = scaler.fit_transform(X_train) # 对训练集数据进行拟合和转换
X_test_standardized = scaler.transform(X_test) # 对测试集数据进行转换
X_test_standardized
2.4 核心对象类型:评估器(estimator)
围绕评估器的使用基本分为两步,其一是实例化该对象,其二则是围绕某数据进行模型训练。
2.5 高级特性——管道
Pipeline是一种方便地将多个步骤组织在一起的工具,常常用于包含多个步骤的数据预处理和建模过程。
Pipeline每个步骤都是独立的,但所有的步骤都依次串联起来,上一步的输出作为下一步的输入。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split# 加载数据
diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.2, random_state=0)# 创建一个Pipeline
pipe = Pipeline([('scaler', StandardScaler()), # 标准化('regressor', LinearRegression()) # 线性回归
])
# 使用Pipeline进行训练
pipe.fit(X_train, y_train)# 创建一个Pipeline
y_prep = pipe.predict(X_test)
y_prep
标准化>>回归预测>>训练>>预测
上述操作创建了一个Pipeline,包含两个步骤:1)StandardScaler,对数据进行标准化;2)LinearRegression,用于进行回归预测。
然后在训练集上调用fit
方法,Pipeline会依次对每个步骤进行训练;
当在测试集上调用predict
方法时,Pipeline会依次对每个步骤进行预测
2.6 模型保存
使用joblib
保存和加载模型,不用每次使用模型都需要去训练,下次使用可以直接加载
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from joblib import dump, load# 加载iris数据集并训练一个随机森林分类器
iris = load_iris()
clf = RandomForestClassifier()
clf.fit(iris.data, iris.target)# 将模型保存到磁盘
dump(clf, 'randomforest_model.joblib')# 在需要的时候加载模型
clf_loaded = load('randomforest_model.joblib') # 使用加载的模型进行预测
y_pred = clf_loaded.predict(iris.data)
y_pred
2.7 监督学习算法
2.7.1 回归
包括线性回归、岭回归、LASSO回归、ElasticNet回归、决策树回归等模型
#从线性模型库导入线性回归模型
from sklearn.linear_model import LinearRegression
# 构建模型实例
lr = LinearRegression(normalize=True)
#训练模型
lr.fit(X_train, y_train)
#预测
y_pred = lr.predict(X_test)
2.7.2 分类
包括逻辑回归、支持向量机、朴素贝叶斯、KNN、随机森林、GBDT等模型
from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier(max_depth=5)
clf.fix(X_train, y_train)# 使用决策树分类算法解决二分类问题,得到的是类别
y_prep = clf.predict(X_test)
# y_prob 为每个样本预测为“0”和“1”类的概率
y_prob = clf.predict_proba(X_test)
2.8 无监督学习算法
2.8.1 聚类算法
包括K-means、DBSCAN、层次聚类、谱聚类等模型
#从聚类模型库导入kmeans
from sklearn.cluster import kmeans
#构建聚类实例
kmeans = KMeans(n_clusters=3, random_state=0)
#拟合
kmeans.fit(X_train)
#预测
kmeans.predict(X_test)
2.8.1 降维算法
最常见的降维方法是PCA(主成分分析)
#导入PCA库
from sklearn.decomposition import PCA
#设置主成分数量为3,n_components代表主成分数量
pca = PCA(n_components=3)
#训练模型
pca.fit(X)
#投影后各个特征维度的方差比例(这里是三个主成分)
print(pca.explained_variance_ratio_)
#投影后的特征维度的方差
print(pca.explained_variance_)
2.9 评价指标
sklearn.metrics
模块包含了一系列用于评价模型的评分函数、损失函数以及成对数据的距离度量函数,评价指标主要分为分类评价指标、回归评价指标等等
#从评价指标库导入准确率
from sklearn.metrics import accuracy_score
#计算样本的准确率
accuracy_score(y_test, y_pred)
#对于测试集而言,大部分函数都必须包含真实值y_test和预测值y_pred
2.10 交叉验证及超参数调优
2.10.1 交叉验证
1)交叉验证的定义?
交叉验证是一种统计学上将数据样本切割成较小子集的实用方法,其基本思想是把在某种意义下将原始数据进行分组,一部分做为训练集,另一部分做为验证集。
目的:为了得到可靠稳定的模型
通过将数据集划分成训练集和验证集,利用训练集训练模型,然后利用验证集对模型进行评估,进而选择最优的超参数,并计算预测误差。
作用:
- 解决模型泛化能力不足、过拟合或欠拟合的问题
- 选择最优的超参数
- 评估模型的稳定性
常用的交叉验证方法:K折交叉验证、留一法交叉验证、随机划分交叉验证
2)交叉验证的案例
例如,有100各样本组成的数据集,可以将其分为5个折叠,每个折叠包含20个样本。将其中4个折叠作为训练集,1个作为测试集。重复过程5次,每次使用不同的折叠作为测试集。最终,我们将所有 5 次评估的结果平均,得到最终的模型性能评估。红色:训练集,蓝色:测试集
假设每次的验证结果为,那么最终的结果为:
,k=5
3)代码实现
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris# 加载数据集
iris = load_iris()
# 特征数据
X = iris.data
# 目标值
y = iris.target# 定义不同的C值
c_test = [0.01,0.1,1,10,100]
# 用于存储交叉验证后的召回率
score = []# 执行交叉验证
for c in c_test:# c值代表正则化强度的倒数,C=0.01 是强正则化,C=100 是弱正则化# solver='lbfgs' 是一种拟牛顿法,适合中小型数据集,支持L2正则化# max_iter 求解器的最大迭代次数lr = LogisticRegression(C=c,solver='lbfgs',max_iter=1000)# 使用5次折叠交叉验证评估 召回率 scoring='recall'cv_score = cross_val_score(lr,X,y,cv=5,scoring='recall')score.append(cv_score.mean())# 不同C值下面的召回率
for c,score in zip(c_test,score):print(f'C={c:.2f}, mean_recall={score:.4f}')
4)K折交叉验证对模型的优势
- 提供更稳健的性能评估
- 最大限度地利用数据
- 评估模型的泛化能力
2.10.2 超参数调优
1)超参数定义
超参数,指的是无法通过数学过程进行最优值求解、但却能够很大程度上影响模型形式和建模结果的因素,例如在线性回归模型中,是否带入截距项,是否对数据进行归一化就是超参数
超参数无法从数据中学习而需要在训练前提供的参数,机器学习模型的性能在很大程度上依赖于寻找最佳超参数集。
from sklearn.linear_model import LinearRegressionmodel = LinearRegression(fit_intercept=True, # 是否计算模型的截距,默认为Truecopy_X=True, # 是否创建数据副本,默认为Truen_jobs=-1, # 并行计算的线程数,None 表示单线程;-1 使用所有可用CPU核心positive=False # 是否强制系数为正数
)
model.get_params()
主流超参数调优技术:网格搜索、随机搜索和贝叶斯搜索
2)网格搜索
在参数网格上进行穷举搜索,方法简单但是搜索速度慢(超参数较多时),且不容易找到参数空间中的局部最优。
#从模型选择库导入网格搜索
from sklearn.model_selection import GridSearchCV
from sklearn import svm
svc = svm.SVC()
#把超参数集合作为字典
params = {‘kernel’:[‘linear’, ‘rbf’], ‘C’:[1, 10]}
#进行网格搜索,使用了支持向量机分类器,并进行五折交叉验证
grid_search = GridSearchCV(svc, params, cv=5)
#模型训练
grid_search.fit(X_train, y_train)
#获取模型最优超参数组合
grid_search.best_params_
3)随机搜索
在参数子空间中进行随机搜索,选取空间中的100个点进行建模(可从scipy.stats
常见分布如正态分布norm、均匀分布uniform中随机采样得到),时间耗费较少,更容易找到局部最优。
#从模型选择库导入随机搜索
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
svc = svm.SVC()
#把超参数组合作为字典
param_dist = {‘kernel’:[‘linear’, ‘rbf’], ‘C’:randint(1, 20)}
#进行随机搜索
random_search = RandomizedSearchCV(svc, param_dist, n_iter=10)
#模型训练
random_search.fit(X_train, y_train)
#获取最优超参数组合
random_search.best_params_
三、案例:房价预测
from sklearn.svm import LinearSVR
from sklearn.datasets import load_boston
import pandas as pdboston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['target'] = boston.target
data_mean = df.mean()
data_std = df.std()
data_train = (df-data_mean)/data_std # 数据标准化
X_train = data_train.drop(columns=['target']).values # 特征数据
y_train = data_train['target'].values # 目标数据linearsvr = LinearSVR(C=0.1)
linearsvr.fit(X_train, y_train)# 预测,还原结果
X = ((df[boston.feature_names]-data_mean[boston.feature_names])/data_std[boston.feature_names]).values
# 添加房价预测的信息列数据
df['y_pred'] = linearsvr.predict(X)*data_std['target']+data_mean['target']
# target为真实价格,y_prep为预测结果
print(df[['target','y_pred']])