《数据采集与分析》期末考试sklearn机器学习部分重要知识点复习(详细版)

《数据采集与分析》期末考试sklearn机器学习部分重要知识点复习(详细版)

一、机器学习总体流程

在这里插入图片描述

机器学习的一般流程通常涵盖以下步骤:

  1. 数据收集和处理:收集原始数据,并对数据进行清理、预处理和特征提取。预处理步骤可能包括数据清洗、缺失值填充、数据归一化、特征选择和降维等。
  2. 模型选择和训练:根据具体问题选择合适的模型,并使用训练数据来训练模型。常用的模型包括线性回归、逻辑回归、决策树、支持向量机、神经网络等。
  3. 模型评估和调优:使用测试数据来评估模型的性能,并根据评估结果对模型进行调优。常用的评估指标包括精确度、召回率、F1值、AUC等。
  4. 模型部署和应用:将训练好的模型部署到实际应用场景中,并使用模型来进行预测和决策。部署方式包括本地部署、云端部署和移动端部署等。

在学生阶段一般省去第四点。

流程总体上分为如下步骤:加载数据集、数据预处理、数据集分裂(产生训练集和测试集)、构建模型对象、拟合模型和评估模型。

二、加载数据集

这里我们一般学习sklearn机器学习库官方自带的一些数据集:

在这里插入图片描述

下面我们以鸢尾花数据集为例子:

from sklearn.datasets import load_iris
iris=load_iris()    #加载数据集
iris.keys()     #查看数据集的键
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

三、将数据集转换为DataFrame

import pandas as pd
iris_data=pd.DataFrame(iris.data,columns=iris.feature_names)    #将数据集转换为DataFrame格式
iris_data['target']=iris.target_names[iris.target]    #将数据集的标签转换为DataFrame格式
iris_data.head(3).append(iris_data.tail(3))   #查看数据集的前三行和后三行

在这里插入图片描述

四、可视化数据

import seaborn as sns
sns.pairplot(iris_data,hue='target',palette='husl')   #hue:按照target列的值分类,palette:调色板

在这里插入图片描述
这里pairplot()是Seaborn中用于绘制多变量关系的函数。它将每对变量之间的关系以散点图或直方图的形式可视化。下面是pairplot()函数中常用的参数介绍:

  1. data:表示要可视化的数据集,可以是DataFrame或numpy数组。
  2. hue:表示要绘制的分类变量的列名,可以为分类变量添加颜色标记。例如,如果想根据鸢尾花的种类(setosa、versicolor或virginica)绘制散点图,可以将hue参数设置为"species"。
  3. vars:表示要绘制的变量子集,可以是DataFrame的列名列表或numpy数组的索引。例如,如果只想绘制两个变量(“sepal_length"和"sepal_width”),可以将vars参数设置为[“sepal_length”, “sepal_width”]。
  4. kind:表示要绘制的图形类型,可以是"scatter"(散点图)或"hist"(直方图)。默认为"scatter"。
  5. diag_kind:表示对角线上绘制的图形类型,可以是"hist"(直方图)或"kde"(核密度估计)。默认为"kde"。
  6. markers:表示散点图中使用的标记,可以是单个字符或用于每个hue级别的字典。默认为"."。
  7. palette:表示要使用的颜色调色板,可以是Seaborn调色板名称、调色板列表或字典。例如,如果想使用深色调色板,可以将palette参数设置为"dark"。

五、数据预处理

1、数据标准化

from sklearn.preprocessing import StandardScaler
X=StandardScaler().fit_transform(iris.data)    
y=iris.target
y
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

在机器学习中,fit()、fit_transform()和transform()都是常见的方法,用于对数据进行处理和训练模型。它们的区别如下:

  1. fit()方法:用于拟合模型或估计器,并根据数据调整模型参数,使模型能够更好地拟合数据。通常在训练数据上使用fit()方法来训练模型,然后使用模型对测试数据进行预测。
  2. fit_transform()方法:先对数据进行拟合和转换,然后返回转换后的数据。通常用于特征提取和降维等预处理步骤。fit_transform()方法可以看作fit()和transform()两个方法的组合,先使用fit()方法拟合数据,再使用transform()方法对数据进行转换。
  3. transform()方法:用于对数据进行转换,通常在训练数据和测试数据上使用相同的transform()方法来进行数据转换。transform()方法通常用于数据预处理和特征工程等步骤,例如数据归一化、特征选择、降维等。

需要注意的是,在使用fit()、fit_transform()和transform()方法时,需要根据具体问题选择合适的方法,并根据模型的要求对数据进行预处理和特征工程。此外,不同的模型可能需要不同的数据预处理方法和特征工程方法,需要根据具体问题进行调整和优化。

2、独热编码

独热编码(One-Hot Encoding)是一种将离散型数据转换为数值型数据的编码方式。在机器学习和深度学习中,独热编码是一种常见的数据预处理方式。

独热编码的基本思想是将每个可能的取值都转换为一个唯一的整数索引,然后将每个索引表示为一个二进制向量,其中只有一个位为 1,其余位都为 0。这样,每个不同的离散值都可以表示为一个唯一的向量,而这些向量之间互相独立,不会产生数值上的大小关系。

例如,如果有一个性别特征,它有两个可能的取值:男性和女性。可以将男性编码为 [1, 0],女性编码为 [0, 1]。这样,原来的性别特征被表示为两个新特征,它们是相互独立的,并且可以输入到模型中进行训练。

独热编码的优点是可以处理离散型数据,并且不会引入数值大小关系。但是,它也会引入高维度的稀疏向量,可能会影响模型的训练效率和泛化能力。

补充说明:划分训练集和测试集后,如果对训练集应用了fit_transform()方法,则测试集要使用同一预处理评估器的transform()方法。

为什么呢?

在机器学习中,我们通常需要将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。在训练模型之前,通常需要对数据进行一些预处理,例如缺失值填充、特征标准化等等。常见的预处理方法包括MinMaxScaler、StandardScaler、PCA等等。

当我们使用预处理方法对训练集进行拟合(fit)时,预处理评估器会根据训练集的特征值计算出一些统计信息(例如均值、标准差等等),并将这些信息存储下来。然后,我们可以使用transform方法将训练集转换为预处理后的数据集。

但是,对于测试集,我们不能再次使用fit方法进行拟合,因为这会导致模型对测试集进行过拟合,从而使测试集的性能评估失去意义。相反,我们应该使用相同的预处理评估器的transform方法将测试集转换为预处理后的数据集。这是因为,在训练集中拟合时计算的统计信息是应用于测试集的,这样才能保证测试集和训练集的预处理方式相同,从而保证了模型在测试集上的性能评估的可靠性。

因此,划分训练集和测试集后,如果对训练集应用了fit_transform()方法,则测试集要使用相同预处理评估器的transform()方法。这样可以确保在测试集上对模型进行评估时,使用的数据与训练集上的数据具有相同的预处理方式。

六、划分数据集

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33) 

这里train_test_split()函数是Python中用于将数据集分成训练集和测试集的函数,通常用于机器学习模型的训练和评估。下面是train_test_split()函数中常用的参数介绍:

  1. test_size:测试集占比,默认值为0.25,即测试集占数据集的25%。可以是一个小数,表示测试集占比;也可以是一个整数,表示测试集样本数。
  2. train_size:训练集占比,默认值为None,即训练集占数据集的剩余部分。如果同时设置了train_size和test_size,则test_size会被忽略。可以是一个小数,表示训练集占比;也可以是一个整数,表示训练集样本数。
  3. random_state:随机种子,默认值为None。用于固定随机数生成器的种子,从而保证每次分割得到的训练集和测试集相同。如果不设置random_state,则每次运行代码得到的结果可能会不同。
  4. shuffle:是否在分割前对数据集进行洗牌,默认值为True。如果设置为False,则按原始数据集的顺序进行划分。
  5. stratify:按指定的类别比例分层抽样,默认值为None。如果设置了stratify,train_test_split()函数将根据指定的类别比例,对数据集进行分层抽样,保证训练集和测试集中的样本比例与原始数据集中的样本比例相同。stratify通常用于处理分类问题。

七、创建模型估计器(estimator)

1、用于回归的估计器

# 线性回归
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
# 支持向量回归SVR
from sklearn.svm import SVR
svr=SVR()
# kNN用于回归
from sklearn.neighbors import KNeighborsRegressor
knn_reg=KNeighborsRegressor()

2、用于分类的估计器

#逻辑回归用于分类
from sklearn.linear_model import LogisticRegression   #助记:把LinearRegression改成LogisticRegression即可
lgr=LogisticRegression()
#支持向量用于分类:使用LinearSVC,只适用于线性可分的数据集,对于大数据集训练非常快,一般作为初始训练的首选
from sklearn.svm import LinearSVC
lsvc=LinearSVC()
#支持向量用于分类:使用SVC,适用于线性可分和不可分的数据集(通过使用核函数),性能不如LinearSVC
from sklearn.svm import SVC
svc=SVC()
# kNN用于分类
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()

八、用训练集训练模型估计器estimator

#根据需要,用具体的上文估计器去替换下面的estimator
# estimator.fit(X_train,y_train)
knn.fit(X_train,y_train)    #训练模型

九、用模型估计器对测试集数据做预测

#根据需要,用具体的上文估计器去替换下面的estimator
# y_pred=estimator.predict(X_test)
y_pred=knn.predict(X_test)  #预测

十、对模型估计器的学习效果进行评价

#最简单的评估方法:就是调用估计器的score(),该方法的两个参数要求是测试集的特征矩阵和标签向量
#对于回归问题,score()返回的结果就是r2_score,参考\machine learning\Regression.ipynb文件
#对于分类问题,score()返回的结果就是下面的ACC
#根据需要,用具体的上文估计器去替换下面的estimator
#print(estimator.score(X_test,y_test))
print(knn.score(X_test,y_test))
0.9473684210526315
#对于二分类问题,还可以使用metrics子包中的confusion_matrix()、precision_score()、recall_score、accuracy_score()等
#这些方法的参数分别是测试集的真实标签和预测标签
from sklearn import metrics
confusion_matrix = metrics.confusion_matrix(y_test,y_pred)       # 混淆矩阵(注意与上面示例的混淆矩阵的图位置并不一一对应)
#recall_score = metrics.recall_score(y_test,y_pred)               # 召回率(查全率)=tp/(tp+fn)
#pre_score = metrics.precision_score(y_test,y_pred)               # 准确率(查准率)=tp/(tp+fp)
ACC = metrics.accuracy_score(y_test,y_pred)                      # 准确度ACC=(tp+tn)/(tp+tn+fp+fn)
print(ACC)
0.39473684210526316
#对于多分类问题,还可以使用metrics子包中的classification_report
print(metrics.classification_report(y_test,y_pred,target_names=iris.target_names)) 
              precision    recall  f1-score   support

      setosa       0.38      0.23      0.29        13
  versicolor       0.47      0.54      0.50        13
   virginica       0.33      0.42      0.37        12

    accuracy                           0.39        38
   macro avg       0.39      0.40      0.39        38
weighted avg       0.39      0.39      0.39        38

十一、网络搜索超参数

超参数说明:模型参数(如果有的话,例如SVM中分离超平面的法向量w和截距b)是通过fit方法从数据中学习到的,而超参数则是人工配置的,因而创建模型对象时指定的参数是超参数。

为了评估不同超参数组合配置下的模型性能,可以采用网格搜索的方法,并且常常与训练数据集的交叉验证进行搭配。

网格搜索的目的是为了优化超参数配置,交叉验证的目的是为了更准确的评估特定超参数配置下的模型性能的可信度,两者作用不同。

#网格搜索与交叉验证相结合的kNN算法分类:

#使用stratify参数进行分层采样
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=33,stratify=iris.target)     #stratify=iris.target表示按照iris.target的值进行分层采样

from sklearn.neighbors import KNeighborsClassifier  
neigh = KNeighborsClassifier()

from sklearn.model_selection import GridSearchCV,KFold  #GridSearchCV网格搜索,KFold交叉验证
params_knn={'n_neighbors':range(3,10,1)}    #参数字典,n_neighbors:邻居数,range(3,10,1)表示从3到10,步长为1
kf=KFold(n_splits=5,shuffle=False)        #n_splits=5表示将数据集分成5份,shuffle=False表示不打乱数据集

grid_search_knn=GridSearchCV(neigh,params_knn,cv=kf)    #cv=kf表示使用kf进行交叉验证
grid_search_knn.fit(X_train,y_train)    
grid_search_y_pred=grid_search_knn.predict(X_test)
print("Accuracy:",grid_search_knn.score(X_test,y_test))
print("best params:",grid_search_knn.best_params_)
Accuracy: 0.9473684210526315
best params: {'n_neighbors': 8}

可见引入网格搜索时,只要把原来的估计器、搜索参数和交叉验证对象(或交叉验证折数)作为参数去创建一个网格搜索估计器,后面凡是原估计器出现的地方都用网格搜索估计器替代即可。

这里KFold()函数是用于K折交叉验证的函数,可以将数据集划分为K个互不重叠的子集,每次使用其中K-1个子集作为训练集,剩余一个子集作为验证集,进行模型训练和评估。下面是KFold()函数中常用的参数介绍:

  1. n_splits:表示将数据集划分为几个子集,默认值为5,即划分为5个子集。可以根据需要设置为其他值,例如10。
  2. shuffle:是否在划分前对数据集进行洗牌,默认值为False。如果设置为True,则在划分前会对数据集进行随机洗牌,从而打破数据集中的顺序性。
  3. random_state:随机种子,默认值为None。用于固定随机数生成器的种子,从而保证每次划分得到的子集相同。如果不设置random_state,则每次运行代码得到的结果可能会不同。
  4. stratified:是否进行分层抽样,默认值为False。如果设置为True,则会进行分层抽样,即保证每个子集中的样本类别比例与原始数据集中的样本类别比例相同。stratified通常用于处理分类问题。
  5. 返回值:KFold()函数返回一个迭代器对象,通过迭代器可以依次获得每个子集的索引。

这里GridSearchCV()函数是用于网格搜索和交叉验证的函数,可以在给定的参数空间中搜索最优超参数组合,并使用交叉验证对模型进行评估。下面是GridSearchCV()函数中常用的参数介绍:

  1. estimator:表示要优化的模型对象。可以是分类器、回归器、管道对象等。例如,如果要优化SVM分类器,可以将estimator参数设置为sklearn.svm.SVC()。
  2. param_grid:表示要搜索的超参数组合字典。字典的键是要优化的超参数名称,值是要搜索的超参数值的列表。例如,如果要搜索SVM分类器的C和gamma两个超参数,可以将param_grid参数设置为{‘C’: [0.1, 1, 10], ‘gamma’: [0.01, 0.1, 1]}。
  3. scoring:表示模型评估指标,默认为None。可以设置为字符串或可调用对象,表示使用的评估指标。例如,如果要使用准确率评估模型,可以将scoring参数设置为’accuracy’。
  4. cv:表示交叉验证的折数,默认为5。可以设置为整数或可迭代对象。例如,如果将cv参数设置为10,则将数据集划分为10个互不重叠的子集,每个子集轮流作为验证集进行模型评估。
  5. refit:表示是否在搜索结束后对整个数据集重新拟合最佳模型,默认为True。如果设置为True,则在搜索结束后,会使用最佳超参数组合重新拟合整个数据集,以获得最终的模型。
  6. n_jobs:表示并行运行的作业数,默认为None。可以设置为整数,表示使用的CPU核心数。如果设置为-1,则表示使用所有可用的CPU核心。
  7. verbose:表示日志输出级别,默认为0。可以设置为整数,表示输出的详细程度。例如,如果将verbose参数设置为2,则会输出更详细的日志信息。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-北天-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值