1. 前言
通过上几章对数据预处理的理解,最后来到我们数据分析的核心之一,机器学习。
机器学习涵盖了许多方面,如若每一次处理都是通过手写代码的方式去处理我们的数据集是十分繁琐,复杂的。但在scikit-learn库中,提供了许多常用的机器学习模型,涵盖了分类,回归,聚类,降维等不同类型的任务。
在进入机器学习之前,数据预处理对于机器学习还有两个重要的部分
2. 数据预处理
2.1 数据集的划分
将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
•train_test_split划分数据集首先划分特征矩阵,其次是目标向量
•test_size : 测试集的比例或数量,可以是浮点数表示比例,也可以是整数表示测试集样本数,test_size被指定之后会自动计算出train_size
• random_state:随机种子,用于保证划分的可重复性。同样的随机种子会导致相同的划分结果,即使在不同时间或环境下运行相同的代码,生成的随机序列也会保持一致。
2.2 数据标准化
数据标准化是指将数据集调整为均值为0,方差为1。
数据标准化的目的在于将特征数据缩放到同一尺度,避免某些特征对模型训练产生过大或过小的影响。提升模型鲁棒性,在面对异常值或噪声数据时,标准化后的模型通常表现的更加鲁棒,标准化能够减少异常值的影响。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train) #计算均值与标准差
scaler.transform(X_train) #对数据进行标准化
scaler.fit_transform(X_train) #一步到位
scaler.fit(X_test) #根据训练集的均值与标准差标准化测试集
转化之后的数据会与原有数据格式保持一致。
需要注意的是
•在对训练集进行标准化后,也应该使用相同的scaler对象对测试集进行转换
•标准化数据之后特征值会变的难以解释,因此在对模型输出进行解释的时候需要特别注意
3. 机器学习模型
3.1 分类模型
3.1.1 Logistic回归
功能:主要用于二分类问题,也可以拓展到多分类问题
算法详解:机器学习全解 - Logistic回归(含算法讲解,公式全解,手写代码实现,调包实现)-CSDN博客
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train,y_train)
主要参数:
penalty | 正则化类型,可以选择‘l1’,'elasticnet',用于防治过拟合 |
solver | 优化算法的选择,例如:'lbfgs',‘liblinear’,‘sag’,‘sage’ |
max_iter | 最大迭代次数,默认值为100。这个参数在数据集较大的时候,可能需要增加以此保持收敛 |
multi_class | 处理多分类任务 |
3.1.2 K近邻分类器
功能:基于最近的K个邻居进行分类
KNN的核心思想是,对于一个待分类的样本,他会寻找在特征空间中距离该样本最近的K个样本,并根据这些邻居的类别决定该样本的类别
1. 计算距离:对于待分类的样本,计算它与训练集中所有样本之间的距离。
2. 选择最近的K个邻居:根据计算出的距离,选择距离最近的K个样本。
3. 投票表决:让这K个类别投票,选择类别占多数的作为新样本的类别。
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train,y_train)y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test,y_pred)
主要参数:
n_neighbors | 设置投票样本数量。K的值通常通过交叉验证的方式确定,较小的K会导致模型变得灵活,较大的K值则使模型更加平滑 |
weights | 指定投票样本权重,'uniform'(每个权重相等),'distance'(离得近的权重越大) |
metric | 用于计算距离的度量标准 |
3.1.3 SVC支持向量机
算法详解请参考:超简单白话文机器学习 - 支持向量机SVM(含算法讲解,公式全解,手写代码实现,调包实现)_支持向量机(svm)-CSDN博客
from sklearn.svm import SVC
model = SVC(kernel='rbf') #kernel代表的是核函数
model.fit(X_train,y_train)
SVC的各个参数可以进行调节:
C | 正则化参数。C 值越大,对误分类的惩罚越大,模型会更倾向于正确分类训练集中的每个样本,但可能导致过拟合。默认值为 1.0 |
kernel | kernel: 核函数类型。常用的有 linear(线性核),poly(多项式核),rbf(高斯核/径向基函数核),sigmoid(Sigmoid 核)。默认值为 rbf |
gamma | gamma: 核函数系数。对于 rbf、poly 和 sigmoid 核,gamma 定义了支持向量的影响范围。gamma 值越大,模型越倾向于将训练样本分类正确,但可能导致过拟合。可以设置为 scale(默认)或 auto |
degree | degree: 多项式核函数的次数,仅当 kernel='poly' 时有效。默认值为 3 |
3.1.4 RandomForest随机森林
功能:基于多棵决策树进行分类
工作原理:
1. 随机采样:
•样本随机采样:训练过程中,有放回的从训练数据集随机采样,生成多个样本子集
•特征随机采样:每次分裂结点时,随机选择特征子集而不是使用所有特征,从而增强树的多样性
2. 构建决策树:每个样本子集用于训练一棵决策树,使用上述随机选择的特征子集进行分裂
3. 集成预测:对于分类任务,随机森林将所有的决策树预测结果进行投票,选择获得票数最多的类别作为最终预测结果
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train,y_train)
n_estimators | 决定森林中树的数量 |
max_depth | 控制树的最大深度,防治过拟合 |
min_samples_split | 一个结点在分裂前必须具有的最小样本数 |
min_samples_leaf | 每个叶子结点应包含的最小样本数 |
max_features | 在每次分裂时考虑的特征数量,较少的特征数可以提高模型的多样性 |
bootstrap | 是否进行有放回采样 |
3.1.5 GradientBoostingClassifier梯度提升分类器
功能:集成多个弱分类器以此提高性能
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(n_estimators=100)
model.fit(X_train,y_train)
3.1.6 朴素贝叶斯分类器
算法详解:超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现_朴素贝叶斯代码解析-CSDN博客
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X_train,y_train)
3.1.7 决策树
通过一系列的二元决策将数据逐步划分,直到每一个叶子结点都属于一个单一的类别
工作原理:
•分裂:在每一个结点处,算法选择一个特征及其对应的阈值,将数据集分裂成两个子集。分裂的目的在于使每个子集中的数据尽可能属于同一个类别
•选择特征:分裂过程中,算法会选择那些能最大程度提高信息增益(或减少基尼指数)的特征
•叶子结点:当结点中的样本全部属于同一类别时,或者不能进一步分裂时,该节点变为叶子结点,并分配一个类别标签
算法详解:超简单白话文机器学习-决策树算法全解(含算法介绍,公式,源代码实现以及调包实现)_白话机器学习算法-CSDN博客
from sklearn.tree import DecisionTreeRegressor
reg = DecisionTreeRegressor()
reg.fit(X_train,y_train)
常用参数:
criterion | 用于衡量分裂质量的标准。对于决策树,常用的是'gini'与'entropy' |
max_depth | 控制树的最大深度,避免过拟合 |
min_samples_split | 一个结点在分裂之前,必须具有的最小样本数,以此控制树的增长,防治过拟合 |
min_samples_leaf | 每个叶子结点最少应包含的样本数 |
3.2 回归模型
3.2.1 线性回归
适用于回归任务
算法详解:超简单白话文机器学习 - 逐步回归&Lasso,Ridge正则化(含算法讲解,公式全解,手写代码实现,调包实现)-CSDN博客
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train,y_train)
print(model.coef_,model.interceot_)
print(model.score) #R^2评分函数,用于衡量模型的解释力,在0-1之间,越接近1,预测能力越强
fit_intercept | 是否计算截距 |
3.2.2 岭回归
算法详解:超简单白话文机器学习 - 逐步回归&Lasso,Ridge正则化(含算法讲解,公式全解,手写代码实现,调包实现)-CSDN博客
功能:带有正则化的线性回归模型
from sklearn.linear_model import Ridge
model = Ridge(alpha=0.1) #惩罚参数
model.fit(X_train,y_train)
3.2.3 Lasso回归
算法详解:超简单白话文机器学习 - 逐步回归&Lasso,Ridge正则化(含算法讲解,公式全解,手写代码实现,调包实现)-CSDN博客
功能:Lasso回归,使用L1正则化的线性回归模型
from sklearn.linear_model import Lasso
model = Lasso()
model.fit(X_train,y_train)
alpha | 正则化强度,值越大,正则化效应越强,更多的系数被缩减为0,可以通过交叉验证来选择合适的值。默认值为1 |
fit_intercept | 是否计算截距 |
3.2.4 回归树
回归树是一种预测连续数值的算法。通过对数据进行分裂,使得每个叶子结点中的样本具有最小的均方误差(MSE)
工作原理:
分裂:在每个节点处选择特征和阈值,但回归树的目标在于每个子集中的样本输出值尽可能相似
选择特征:通过最小化均方误差来选择特征进行分裂
叶子结点:当进一步分裂不能显著降低误差时,该节点变为叶子结点,且分配一个值作为预测值(通常为均值)
算法详解:超简单白话文机器学习 - 回归树&树剪枝(含算法介绍,公式,源代码实现以及调包实现)-CSDN博客文章浏览阅读1.6k次,点赞33次,收藏28次。我们一般使用CART回归树,CART(Classification and Regression Trees)回归树是一种用于连续值预测的树模型。它通过递归地分裂数据集,以最小化预测误差为目标,最终生成一棵树结构的模型。_回归树https://blog.csdn.net/qq_51222843/article/details/139125581
from sklearn.tree import DecisionTreeRegressor
reg = DecisionTreeRegressor()
reg.fit(X_train,y_train)
criterion | 用于衡量分裂质量的标准。对于回归树,常用的是mse |
max_depth | 控制树的最大深度,避免过拟合 |
min_samples_split | 一个结点在分裂之前,必须具有的最小样本数,以此控制树的增长,防治过拟合 |
min_samples_leaf | 每个叶子结点最少应包含的样本数 |
3.2.5 SVR支持向量机回归
功能:适用于线性和非线性回归
from sklearn.svm import SVR
model = SVR()
model.fit(X_train,y_train)
3.2.6 RandomForest随机森林
功能:基于多棵决策树进行分类
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(n_estimators=100)
model.fit(X_train,y_train)
3.2.7 GradientBoostingClassifier梯度提升分类器
功能:集成多个弱分类器以此提高性能
from sklearn.ensemble import GradientBoostingRegressor
model = GradientBoostingRegressor(n_estimators=100)
model.fit(X_train,y_train)
3.3 聚类模型
3.3.1 KMeans均值聚类
功能:适用于无监督学习中的聚类任务
算法详解:机器学习全解 - K均值聚类算法 (含算法介绍,公式,手写代码实现,调包实现)-CSDN博客
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(x)
参数详解:
n_clusters | 指定质心数量 |
max_iter | 最大迭代次数 |
tol | 判断收敛条件,若质心变化小于这个值,算法停止 |
algorithm | 使用的KMeans计算方法 |
得到我们的模型之后也有相关属性去查看,调用模型信息:
cluster_centers_ | 表示质心坐标,形状为(n_clusters,n_features) |
labels_ | 数据集中的每个样本的簇标签 |
inertia_ | 表示簇内样本距离各自簇心的总和,即SSE;越小,代表越近,聚类效果越好 |
3.3.2 AgglomerativeClustering层次聚类算法
功能:通过构建聚类树实现聚类
from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters=3)
model.fit(X_train)
3.4 降维模型
3.4.1 PCA主成分分析
功能:主成分分析,用于数据降低维度
算法详解:机器学习全解 - PCA主成分分析(含算法讲解,公式全解,手写代码实现,调包实现)_pca计算公式讲解-CSDN博客
from sklearn.decomposition import PCA
pca = PCA(n_components=2) #维度降为2
X_reduced = pca.fit_transform(X) #直接将原有数据转化#分别进行并且读取属性
pca.fit(X)
print(pca.components_) #读取属性
PCA模型对数据十分敏感,因此在开始之前对数据进行标准化处理,使每个变量的均质为0,方差为1。
相关参数:
n_components | 保留的主成分数目 |
相关属性:
components_ | 输出主成分的方向向量,每一行是一个主成分在原始特征空间中的方向 |
explained_variance_ | 每个主成分对应的特征值,表示该主成分解释的方差大小,方差越大离散程度就越大 |
n_features_ | 数据集中原始特征的数量 |
n_samples_ | 数据集中样本的数量 |
mean_ | 返回输入数据的均值 |
singular_values_ | 返回奇艺值分解过程中每个主成分的奇艺值 |
3.5 数据集成
3.5.1 Bagging
功能:Bagging集成方法,通过多个弱分类器的集成提升模型性能
算法详解:机器学习全解 - 集成学习&Adaboost(含算法讲解,公式全解,手写代码实现,调包实现)_集成学习ada-CSDN博客
from sklearn.ensemble import BaggingClassifier
model = BaggingClassifier(base_estimator=SVC(),n_estimators=10)
model.fit(X_train,y_train)
参数详解:
base_estimator | 基分类器,默认为DecisionTreeclassifier |
n_estimators | 表示要训练的基分类器数量 |
max_samples | 每个子样本中使用的样本数 |
max_features | 每个子样本中使用的特征数 |
bootstrap_features | 是否有放回抽样 |
random_state | 随机性控制 |
3.5.2 AdaBoost集成
功能:逐步调整分类器权重来提高分类效果
算法详解:机器学习全解 - 集成学习&Adaboost(含算法讲解,公式全解,手写代码实现,调包实现)_集成学习ada-CSDN博客
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=100)
model.fit(X_train,y_train)
参数详解:
base_estimator | 基分类器,默认为DecisionTreeclassifier |
n_estimators | 表示要训练的基分类器数量 |
learning_rate | 所见每个弱分类器的贡献 |
algorithm | 'SAMME','SAMME.R'不同权重进行方法 |
random_state | 随机性控制 |
3.6 模型管道与选择
3.6.1 Pipeline
功能:将多个数据预处理步骤和模型训练步骤组合成一个可重用的管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipeline = Pipeline([('scaler',StandardScaler()),('svc',SVC(kernel='rbf'))])
pipeline(X_train,y_train)
3.6.2 网格搜索
功能:网格搜索,用于调优超参数,选择最佳模型参数
from sklearn.model_selection import GridSearchCV
param_grid = {'C':[0.1,1,10,100],'gamma':[1,0.1,0.01,0.001],'kernel:['rbf','linear']}from sklearn.svm import SVC
model = SVC()grid_search = GridSearchCV(estimator=model,param_grid=param_grid,cv=5,scoring='accuracy')
grid_search.fit(X_train,y_train)#获取最佳参数
print(grid_seach.best_params_) #返回最佳的超参数组合
print(grid_search.best_score_) #返回最佳组合的交叉验证得分
以下是GridSearchCv的参数详解:
estimator | 用于评估的模型,需要先初始化 |
param_grid | 用来迭代的参数,矩阵样式进行填充 |
cv | 用于交叉验证的次数 |
scoring | 指定用于挑选最佳参数的比较特征 |