【机器学习基础】Scikit-learn主要用法

news2024/9/25 17:13:39

在这里插入图片描述

【作者主页】Francek Chen
【专栏介绍】 ⌈ ⌈ Python机器学习 ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,依赖于强大的开源库如Scikit-learn、TensorFlow和PyTorch。本专栏介绍机器学习的相关算法以及基于Python的算法实现。

文章目录

    • 一、Scikit-learn概述
    • 二、Scikit-learn主要用法
      • (一)基本建模流程
      • (二)加载数据集
      • (三)划分数据集
      • (四)数据预处理
      • (五)构建并拟合模型
      • (六)评估模型
      • (七)模型优化
    • 三、Scikit-learn案例


一、Scikit-learn概述

  Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。
  自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法。还包括了特征提取,数据处理和模型评估三大模块。

在这里插入图片描述

二、Scikit-learn主要用法

符号标记

符号意义符号意义
X_train训练数据y_train训练集标签
X_test测试数据y_test测试集标签
X完整数据y数据标签

(一)基本建模流程

在这里插入图片描述
总体处理流程可以分为:加载数据集、数据预处理、数据集划分、模型估计器创建、模型拟合、模型性能评估

(二)加载数据集

1. 导入工具包

from sklearn import datasets, preprocessing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

2. 加载数据

  Scikit-learn支持以NumPy的arrays对象、Pandas对象、SciPy的稀疏矩阵及其他可转换为数值型arrays的数据结构作为其输入,前提是数据必须是数值型的。
  sklearn.datasets模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、Olivetti人脸、MNIST数据集等的工具,也包括了一些toy data如S型数据等的生成工具。

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

(三)划分数据集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=12, stratify=y, test_size=0.3)

在这里插入图片描述
将完整数据集的70%作为训练集,30%作为测试集,并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True提前打乱数据。

(四)数据预处理

1. 数据变换

使⽤Scikit-learn进行数据标准化:

# 导入数据标准化工具包
from sklearn.preprocessing import StandardScaler
# 构建转换器实例
scaler = StandardScaler()
# 拟合及转换
scaler.fit_transform(X_train)

Z-Score标准化: x ∗ = x − μ σ σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 , μ = 1 m ∑ i = 1 m x ( i ) x^*=\frac{x-\mu}{\sigma} \\[2ex] \sigma^2=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)^2,\mu=\frac{1}{m}\sum_{i=1}^mx^{(i)} x=σxμσ2=m1i=1m(x(i)μ)2μ=m1i=1mx(i) 处理后的数据均值为0,方差为1。

使用Scikit-learn进行数据变换:

  • 最小最大标准化:MinMaxScaler
    归一化(最大 - 最小规范化): x ∗ = x − x min ⁡ x max ⁡ − x min ⁡ x^*=\frac{x-x_{\min}}{x_{\max}-x_{\min}} x=xmaxxminxxmin 将数据映射到 [ 0 , 1 ] [0,1] [0,1] 区间

  • One-Hot编码:OneHotEncoder

  • 归一化:Normalizer

  • 二值化(单个特征转换):Binarizer

  • 标签编码:LabelEncoder

  • 缺失值填补:Imputer

  • 多项式特征生成:PolynomialFeatures

2. 特征选择

from sklearn import feature_selection as fs

过滤式(Filter),保留得分排名前k的特征(top k方式)。

fs.SelectKBest(score_func, k)

封装式(Wrap- per),结合交叉验证的递归特征消除法,自动选择最优特征个数。

fs.RFECV(estimator, scoring=“r2”)

嵌入式(Embedded),从模型中自动选择特征,任何具有coef_或者feature_importances_的基模型都可以作为estimator参数传入。

fs.SelectFromModel(estimator)

(五)构建并拟合模型

1. 监督学习算法——回归

from sklearn.linear_model import LinearRegression
# 构建模型实例
lr = LinearRegression(normalize=True)
# 训练模型
lr.fit(X_train, y_train)
# 作出预测
y_pred = lr.predict(X_test)
  • LASSO:linear_model.Lasso
  • Ridge:linear_model.Ridge
  • ElasticNet:linear_model.ElasticNet
  • 回归树:tree.DecisionTreeRegressor

2. 监督学习算法——分类

from sklearn.tree import DecisionTreeClassifier
# 构建模型实例
clf = DecisionTreeClassifier(max_depth=5)
# 训练模型
clf.fit(X_train, y_train)
# 作出预测
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)

使用决策树分类算法解决二分类问题,y_prob为每个样本预测为“0”和“1”类的概率。

  • 逻辑回归:linear_model.LogisticRegression
  • 支持向量机:svm.SVC
  • 朴素贝叶斯:naive_bayes.GaussianNB
  • K近邻:neighbors.NearestNeighbors

3. 监督学习算法——集成学习

sklearn.ensemble模块包含了一系列基于集成思想的分类、回归和离群值检测方法。

from sklearn.ensemble import RandomForestClassifier
# 构建模型实例
clf = RandomForestClassifier(n_estimators=20)
# 训练模型
clf.fit(X_train, y_train)
# 作出预测
y_pred = clf.predict(X_test)
y_prob = clf.predict_proba(X_test)
  • AdaBoost(适应提升算法):
    ensemble.AdaBoostClassifier
    ensemble.AdaBoostRegressor
  • GBboost(梯度提升算法):
    ensemble.GradientBoostingClassifier
    ensemble.GradientBoostingRegressor

4. 无监督学习算法——k-means

sklearn.cluster模块包含了一系列无监督聚类算法。

from sklearn.cluster import KMeans
# 构建模型实例
kmeans = KMeans(n_clusters=3, random_state=0)
# 训练模型
kmeans.fit(X_train)
# 作出预测
kmeans.predict(X_test)
  • DBSCAN:cluster.DBSCAN
  • 层次聚类:cluster.AgglomerativeClustering
  • 谱聚类:cluster.SpectralClustering

5. 无监督学习算法——降维

sklearn.decomposition模块包含了一系列无监督降维算法。

from sklearn.decomposition import PCA
# 导入PCA库,设置主成分数量为3,n_components代表主成分数量
pca = PCA(n_components=3)
# 训练模型
pca.fit(X)
# 投影后各个特征维度的方差比例(这里是三个主成分)
print(pca.explained_variance_ratio_)
# 投影后的特征维度的方差
print(pca.explained_variance_)

(六)评估模型

sklearn.metrics模块包含了一系列用于评价模型的评分函数、损失函数以及成对数据的距离度量函数。

from sklearn.metrics import accuracy_score
accuracy_score(y_true, y_pred)

对于测试集而言,y_test即是y_true,大部分函数都必须包含真实值y_true和预测值y_pred

1. 回归模型评价

  • 平均绝对误差MAE:metrics.mean_absolute_error()
  • 均方误差MSE:metrics.mean_squared_error()
  • 决定系数R²:metrics.r2_score()

2. 分类模型评价

  • 正确率:metrics.accuracy_score()
  • 各类精确率:metrics.precision_score()
  • F1值:metrics.f1_score()
  • 对数损失或交叉熵损失:metrics.log_loss()
  • 混淆矩阵:metrics.confusion_matrix
  • 含多种评价的分类报告:metrics.classification_report

(七)模型优化

1. 交叉验证

from sklearn.model_selection import cross_val_score
clf = DecisionTreeClassifier(max_depth=5)
scores = cross_val_score(clf, X_train, y_train, cv=5, scoring=’f1_weighted’)

使用5折交叉验证对决策树模型进行评估,使用的评分函数为F1值。
sklearn提供了部分带交叉验证功能的模型类如LassoCVLogisticRegressionCV等,这些类包含cv参数。

在这里插入图片描述
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. 超参数调优⸺随机搜索

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_

在参数子空间中进行随机搜索,选取空间中的100个点进行建模(可从scipy.stats常见分布如正态分布norm、均匀分布uniform中随机采样得到),时间耗费较少,更容易找到局部最优。

三、Scikit-learn案例

可参考:Python数据分析实验四:数据分析综合应用开发

应用Scikit-Learn库中的逻辑回归对Scikit-Learn自带的乳腺癌(from sklearn.datasets import load_breast_cancer)数据集进行分类,并分别评估每种算法的分类性能。为了进一步提升算法的分类性能,能否尝试使用网格搜索和交叉验证找出每种算法较优的超参数。

#加载数据集
from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()

#对数据集进行预处理,实现数据标准化
from sklearn.preprocessing import StandardScaler
X=StandardScaler().fit_transform(cancer.data)
y=cancer.target

#将数据集划分为训练集和测试集(要求测试集占25%,随机状态random state设置为33)
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) 

#创建模型估计器estimator
from sklearn.linear_model import LogisticRegression
lgr=LogisticRegression()

#用训练集训练模型估计器estimator
lgr.fit(X_train,y_train)

#用模型估计器对测试集数据做预测
y_pred=lgr.predict(X_test)

#对模型估计器的学习效果进行评价
#最简单的评估方法:就是调用估计器的score(),该方法的两个参数要求是测试集的特征矩阵和标签向量
print("测试集的分类准确率为:",lgr.score(X_test,y_test))
print(" ")
from sklearn import metrics
#对于多分类问题,还可以使用metrics子包中的classification_report
print(metrics.classification_report(y_test,y_pred,target_names=cancer.target_names)) 

#网格搜索与交叉验证相结合的逻辑回归算法分类:
from sklearn.model_selection import GridSearchCV,KFold
params_lgr={'C':[0.01,0.1,1,10,100],'max_iter':[100,200,300],'solver':['liblinear','lbfgs']}
kf=KFold(n_splits=5,shuffle=False)

grid_search_lgr=GridSearchCV(lgr,params_lgr,cv=kf)
grid_search_lgr.fit(X_train,y_train)
grid_search_y_pred=grid_search_lgr.predict(X_test)
print("Accuracy:",grid_search_lgr.score(X_test,y_test))
print("best params:",grid_search_lgr.best_params_)

在这里插入图片描述

另外,推荐一个Scikit-learn学习网站:Scikit-learn中文社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 ——— 学习、使用 strstr函数 并模拟实现

目录 strstr函数的功能 学习strstr函数​编辑 使用strstr函数 模拟实现strstr函数 strstr函数的功能 在字符串 str1 中找 str2 字符串,如果在 str1 字符串中找到了 str2 字符串,就返回 str1 中找到的 dtr2 的地址,没找到的话就返回 NU…

[CR]厚云填补_MSDA-CR

Cloud Removal in Optical Remote Sensing Imagery Using Multiscale Distortion-Aware Networks Abstract 云层污染是光学遥感图像中常见的问题。基于深度学习的遥感图像去云技术近年来受到越来越多的关注。然而,由于缺乏对云失真效果的有效建模和网络较弱的特征表…

EasyMR如何为服务开启Kerberos

作者:雅泽 一、Hadoop为什么需要安全 最早部署Hadoop集群时并没有考虑安全问题,未开启安全认证时,Hadoop 是以客户端提供的用户名作为用户凭证, 一般即是发起任务的Unix 用户。一般线上机器部署服务会采用统一账号,当…

CPU与Load

1、CPU和LOAD分别是什么load就是负载吗,跟CPU啥关系,啥区别 CPU和Load(负载)是衡量计算机系统性能的两个重要指标,但它们关注的侧重点和意义不同。理解这两个指标及它们之间的关系对于系统优化和性能监控非常重要。 CP…

【C++】数组案例 五只小猪称体重

题目:给出物质小猪体重,找出最大的体重的值并打印 思路:利用菽粟写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…

【QT】qss

目录 基本语法 设置全局样式 问题 分离样式代码 方案1 方案2 选择器 概况 子控件选择器 伪类选择器 盒子模型 修改控件样式示例 按钮 属性小结 复选框 属性小结 输入框 属性小结 列表框 属性小结 渐变色 示例: 菜单栏 设置菜单栏的背景…

clang 编译cuda原理

背景 最近在看一门julia的语言,里面是原生支持cuda的,不过在国产卡上却无法适配,为了开展工作有必要了解非常清楚整个编译的机制。此外在研究过程中发现openai 的triton,以及tvm等一些ai框架对nvidia的支持原理都及其类似&#x…

LinkedList接口源码解读

LinkedList 接口源码解读(一) 前言 因为追求质量,所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。大概还有两篇文章。废话不多说,正片开始! 大家都知道,LinkedList是在Java底层中是由 …

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参(默认)构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

一次Linux端口冲突问题排查记录

更多技术博客,请关注微信公众号:运维之美 一、问题现象 实施同学反馈说我们的服务部署到客户环境后,运行正常,但是后台页面就是无法打开,出现访问白屏问题 从console报错看是其中一个接口响应存在问题,…

老兵永远跟党走,团结奋进新征程-百余老兵庆八一暨《永远闪光的军徽》新书发布座谈会在昆举行

7月30日上午,由中国红色文化研究会老山精神专业委员会主办,昆明乡羊香园承办的百余老兵庆祝“八一”建军节暨《永远闪光的军徽》新书发布座谈会在昆明滇池湖畔乡羊香园举行。 上午10时左右,老战士、曾担任云南省军区领导的黄光汉、陶昌廉、和志光、李继才、雷玉德、王永银老将军…

海思Hi35XX系列(一)环境搭建与挂载

小白一个,新的开发板刚到手有点懵,之前没弄过没有经验,简单记录一下吧 一般买开发板都会给带一个已经配置好的虚拟机文件,直接使用就可以 一、下载安装虚拟机与镜像文件 VMware-workstation16.1.0 我的镜像文件是官方文档资料…

亨廷顿小勇士必看!你的维生素补给站来啦~

Hey小伙伴们~👋 今天咱们来聊聊一个超勇敢的话题——亨廷顿舞蹈症宝贝们的健康小秘密!🎉 虽然路途偶尔有点小颠簸,但记得哦,你们是最闪耀的星星✨!让我们一起加油,用对维生素,守护这…

C#知识|文件与目录操作:对象的创建、保存、读取

哈喽,你好啊,我是雷工! 面向对象编程的特点就是一切皆对象,操作的也是对象,本节学习文件与目录操作中,对象的保存; 以下为学习笔记。 01 对象的特点 ①:对象运行在内存中&#xff…

4.5K Stars!为 RAG 而生的数据工程神器

—1 大模型 RAG 的难题是什么? RAG 或者 Fine-tuning 微调作为大模型的增强技术,最核心的技术在于如何把企业的私有数据清洗转换成知识,企业中能够第一时间拿到的私有数据,往往是异构的、数据质量参差不齐,通过数据…

ICM-20948芯片详解(3)

接前一篇文章:ICM-20948芯片详解(2) 三、引脚图、信号描述及内部框图 1. 引脚图 ICM-20948的引脚图如下图所示: 2. 引脚详细描述 ICM-20948的引脚详细描述如下表所示: 注意:不支持在SCL/SCLK和nCS引脚保…

Linux系统窗口水印难点分析

给应用程序加水印是保护数据的一种方式,window上可以通过给进程通过注入的方法给进程的窗口创建一个同大小的副窗口,在副窗口上绘制水印内容,同时设置副窗口透明同时透传事件,这样就可以达到在源窗口上显示水印的效果且不影响程序…

易媒助手:神似融媒宝的自媒体运营工具,新人送7天中级VIP

自媒体运营工具中还有一个易媒助手,功能与融媒宝、蚁小二类似,免费用户可发5个账号,三者同时用就可发15个账号了,所以今天也给大家介绍下: 易媒助手简介 易媒助手于2017年开发,致力于成为中国更优秀的新媒…

springboot集成海康SDK,设备抓图,热成像仪设置多个点代码获取,以及针对红外图点击某一点获取该点温度的需求

本文会介绍java对海康sdk的三个功能: 1、用代码实时抓图 2、用代码获取热成像仪21个点的坐标及其实时温度 3、针对海康热成像仪抓取的热图能够随便点击任意一个点就能获取其温度的功能。 第一个功能,抓图 抓图 在海康提供的sdk中取流后抓图调用的是 …

ollama运行阿里云通义千问72B大模型

准备 安装ollama https://github.com/ollama/ollama 模型 合并gguf copy /B qwen2-72b-instruct-q5_k_m-00001-of-00002.gguf qwen2-72b-instruct-q5_k_m-00002-of-00002.gguf qwen2-72b-instruct-q5_k_m.gguf设置并启动 新建Modelfile FROM ./qwen2-72b-instruct-q5_k…