当前位置: 首页 > news >正文

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 次评估的结果平均,得到最终的模型性能评估。红色:训练集,蓝色:测试集

假设每次的验证结果为E_{i},那么最终的结果为: ,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']])

http://www.dtcms.com/a/278910.html

相关文章:

  • 【日常技能】excel的vlookup 匹配#N/A
  • 《大数据技术原理与应用》实验报告二 熟悉常用的HDFS操作
  • 【王树森推荐系统】聚类召回
  • git 访问 github
  • 多用户图书管理系统
  • 张艺兴探班RED女团一周年舞台,见证21岁的梦想落地生根
  • sqli-labs靶场通关笔记:第11-16关 POST请求注入
  • 文献查找任务及其方法
  • 车载诊断框架 --- 车载诊断GuideLine
  • 【t检验】用奶茶店排队案例解释
  • urlencode、html实体编码、unicode
  • ChatDev 简易指导文档
  • Spring Boot Cucumber 测试报告嵌入方法
  • gitlab-ci.yml
  • ps如何批处理文件(批量裁剪,批量设置文件大小)
  • RNN(循环神经网络)
  • 青岛国瑞 RCV 带来的独特价值
  • MinIo快速入门
  • 13.计算 Python 字符串的字节大小
  • Kubernetes 高级调度 02
  • victoriametrics Operator 安装
  • 雅思练习总结(二十九)
  • 前端docx库实现将html页面导出word
  • AI革命,分布式存储也在革命,全闪化拐点已至
  • 【第一章编辑器开发基础第二节编辑器布局_2GUI中滚动列表(2/4)】
  • Web Socket 学习笔记
  • C# 入门学习教程(三)
  • Python基础语法1:注释与输入输出、变量与简单数据类型、运算符与表达式、条件判断与循环
  • 云原生技术与应用-Containerd容器技术详解
  • MySQL数据库的基础操作