机器学习之sklearn基础教程
机器学习库scikit-learn(简称sklearn)是Python中一个功能强大的机器学习库,它提供了大量用于数据挖掘和数据分析的工具,包括分类、回归、聚类、降维等算法。文中我们一起简单探讨sklearn的一些基础知识,总结梳理下sklean的结构脉络,算是一个小小的入门教程吧。
目录
- 一、安装sklearn
- 二、数据预处理
- 2.1 特征缩放
- 1. StandardScaler
- 2. MinMaxScaler
- 3. MaxAbsScaler
- 4. RobustScaler
- 5. Normalizer
- 2.2 数据清洗
- 处理缺失值
- 2.3 编码分类特征
- 独热编码(One-Hot Encoding)
- 标签编码(Label Encoding)
- 2.3. 特征选择和降维
- 方差阈值
- 单变量特征选择
- 主成分分析(PCA)
- 2.4. 数据拆分
- 2.5. 数据转换
- 多项式特征
- 三、分类算法
- 逻辑回归分类
- 四、回归算法
- 线性回归预测
- 五、模型评估与调优
- 交叉验证和网格搜索
- 结语
一、安装sklearn
先安装Python环境。可以使用pip来安装sklearn库:
pip install scikit-learn
二、数据预处理
在使用sklearn进行机器学习之前,需要对数据进行预处理。sklearn提供了一系列的数据预处理工具,如StandardScaler
用于特征缩放,OneHotEncoder
用于处理类别特征等。
2.1 特征缩放
在数据预处理中,特征缩放是一个非常重要的步骤,它可以帮助提升机器学习算法的性能和稳定性。在sklearn库中,提供了多种特征缩放和预处理的工具:
1. StandardScaler
- 作用:用于特征的标准化,即将特征值缩放到均值为0,方差为1的分布。
- 栗子:
from sklearn.preprocessing import StandardScaler
import numpy as np# 创建一个数据集
X = np.array([[1, 2], [3, 4], [5, 6]])# 初始化StandardScaler
scaler = StandardScaler()# 使用fit_transform方法对数据进行缩放
X_scaled = scaler.fit_transform(X)print(X_scaled)
2. MinMaxScaler
- 作用:将特征数据缩放到一个指定的范围(通常是0到1),或者也可以将每个特征的最大绝对值缩放到单位大小。
- 栗子:
from sklearn.preprocessing import MinMaxScalerdata = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler()# 使用fit_transform方法对数据进行缩放
scaled_data = scaler.fit_transform(data)print(scaled_data)
3. MaxAbsScaler
- 作用:将每个特征缩放到[-1, 1]的范围内,通过除以每个特征的最大绝对值来实现。
- 栗子:
from sklearn.preprocessing import MaxAbsScalerX = np.array([[1, -1, 2], [2, 0, 0], [0, 1, -1]])
scaler = MaxAbsScaler()# 使用fit_transform方法对数据进行缩放
X_scaled = scaler.fit_transform(X)print(X_scaled)
4. RobustScaler
- 作用:使用中位数和四分位数范围(IQR)来缩放特征。这对于有许多离群点的数据集特别有用。
- 栗子:
from sklearn.preprocessing import RobustScalerX = np.array([[1, -2, 2], [2, -1, 0], [0, 1, -1]])
scaler = RobustScaler()# 使用fit_transform方法对数据进行缩放
X_scaled = scaler.fit_transform(X)print(X_scaled)
5. Normalizer
- 作用:将每个样本缩放到单位范数,即使得每个样本的L1或L2范数为1。
- 栗子:
from sklearn.preprocessing import NormalizerX = np.array([[1, 2], [3, 4], [5, 6]])
normalizer = Normalizer(norm='l2') # 可以选择'l1'或'l2'范数# 使用fit_transform方法对数据进行缩放
X_normalized = normalizer.fit_transform(X)print(X_normalized)
2.2 数据清洗
数据清洗包括处理缺失值、异常值、重复值等。
处理缺失值
- 栗子:使用
SimpleImputer
填充缺失值。
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean') # 可以选择'mean'、'median'、'most_frequent'等策略
X_train_imputed = imputer.fit_transform(X_train)
2.3 编码分类特征
对于分类数据,需要将其转换为机器学习模型可以理解的数值形式。
独热编码(One-Hot Encoding)
- 栗子:使用
OneHotEncoder
进行独热编码。
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
X_train_encoded = encoder.fit_transform(X_train)
标签编码(Label Encoding)
- 虽然sklearn不直接提供标签编码的类,但可以使用
LabelEncoder
对目标变量进行编码。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train_encoded = le.fit_transform(y_train)
2.3. 特征选择和降维
选择重要的特征或降低数据的维度可以帮助提高模型的效率和准确性。
方差阈值
- 栗子:使用
VarianceThreshold
删除方差低于阈值的特征。
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1)
X_train_selected = selector.fit_transform(X_train)
单变量特征选择
- 栗子:使用
SelectKBest
选择与目标变量相关性最高的K个特征。
from sklearn.feature_selection import SelectKBest, f_regression
selector = SelectKBest(score_func=f_regression, k=5)
X_train_selected = selector.fit_transform(X_train, y_train)
主成分分析(PCA)
- PCA是一种常用的降维技术,虽然它不属于预处理步骤,但经常在数据预处理后使用。
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 指定要保留的主成分数量
X_train_reduced = pca.fit_transform(X_train)
2.4. 数据拆分
在机器学习中,通常需要将数据集拆分为训练集和测试集。
- 栗子:使用
train_test_split
拆分数据集。
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)
2.5. 数据转换
数据转换包括将数据集转换为更适合机器学习模型的形式。
多项式特征
- 栗子:使用
PolynomialFeatures
生成多项式特征。
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 指定多项式的度数
X_train_poly = poly.fit_transform(X_train)
这些预处理工具和技术在sklearn库中都有提供,可以根据具体的数据集和机器学习任务来选择合适的预处理步骤。
三、分类算法
分类算法是机器学习领域的一个重要分支,旨在根据输入数据的特征将其划分为不同的类别。下面勒是一些常用的分类算法:
-
逻辑回归(Logistic Regression):
- 逻辑回归是一种线性分类算法,通过逻辑函数预测概率,根据概率决定分类的阈值。
- 适用于二分类问题,如预测邮件是否为垃圾邮件。
-
决策树(Decision Tree):
- 通过递归地选择最佳特征并对特征进行分割,构建树形结构进行分类。
- 易于理解和解释,能处理数值型和类别型数据。
- 可用于银行决定是否给客户贷款等场景。
-
支持向量机(Support Vector Machine, SVM):
- SVM通过寻找最大边际超平面来分隔不同的类别。
- 在高维空间表现良好,适用于小样本数据集,但对大规模数据集的训练效率较低。
- 可应用于手写数字识别等任务。
-
朴素贝叶斯(Naive Bayes):
- 基于贝叶斯定理的分类算法,假设特征之间相互独立。
- 简单、高效,特别适用于文本分类,如新闻文章分类。
-
K-近邻算法(K-Nearest Neighbors, KNN):
- 基于实例的学习方法,通过计算待分类样本与训练样本的距离来进行分类。
- 简单直观,但计算成本随数据集增大而增加。
- 可用于房地产价格评估等场景。
-
随机森林(Random Forest):
- 一种集成学习方法,通过构建多个决策树并进行投票来提高分类准确性。
- 能有效减少过拟合,提高模型的稳定性。
- 可应用于信用卡欺诈检测等任务。
-
梯度提升树(Gradient Boosting Trees, GBT):
- 另一种集成学习算法,通过逐步添加新的弱分类器来纠正前一个模型的错误。
- 在许多机器学习竞赛中表现优异,但训练时间可能较长。
- 可用于优化用户行为预测等场景。
-
神经网络(Neural Networks):
- 神经网络是通过模拟人脑神经元连接方式而建立的一种复杂网络模型。
- 适用于图像识别、语音识别、自然语言处理等复杂任务。
- 常见的神经网络类型包括前馈神经网络、反馈神经网络和图神经网络等。其中前馈神经网络(如多层感知机)是应用最广泛的类型之一。
这些分类算法各有特点和适用场景,下面整一个使用逻辑回归进行分类的例子吧:
逻辑回归分类
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化逻辑回归模型
logreg = LogisticRegression()# 训练模型
logreg.fit(X_train, y_train)# 预测测试集
y_pred = logreg.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
四、回归算法
回归算法是用于预测连续数值输出的监督学习算法。下面是一些常用的回归算法:
-
线性回归(Linear Regression):
- 线性回归用于建立连续数值输出与一个或多个输入特征之间的线性关系。
- 它假设输出与输入特征之间存在线性关系,即可以用一条直线或平面来拟合数据。
- 线性回归的目标是找到一条最佳拟合直线,以最小化预测值与真实值之间的误差。
-
多项式回归(Polynomial Regression):
- 多项式回归是线性回归的扩展,通过引入多项式特征来处理非线性关系。
- 它能够拟合更复杂的数据分布,特别是当数据呈现非线性趋势时。
-
岭回归(Ridge Regression):
- 岭回归是一种正则化的线性回归方法,用于处理共线性问题(即特征之间高度相关)。
- 通过在损失函数中加入L2正则化项,岭回归能够收缩回归系数,减少模型的复杂度,防止过拟合。
-
Lasso回归(Lasso Regression):
- Lasso回归也是一种正则化的线性回归方法,与岭回归类似,但使用的是L1正则化。
- Lasso回归倾向于产生稀疏的回归系数,即某些系数会变为零,从而实现特征的自动选择。
-
弹性网络回归(Elastic Net Regression):
- 弹性网络回归是岭回归和Lasso回归的折中方法。
- 它同时使用了L1和L2正则化,通过调整两者的权重来平衡模型的稀疏性和稳定性。
-
支持向量回归(Support Vector Regression, SVR):
- 支持向量回归是支持向量机在回归问题上的应用。
- 它试图找到一个超平面,使得所有数据点到该超平面的距离之和最小。
- SVR对异常值具有一定的鲁棒性,并且适用于高维数据。
-
决策树回归(Decision Tree Regression):
- 决策树回归使用树形结构来表示输入特征与输出值之间的关系。
- 通过递归地将数据划分为不同的子集,并基于某些准则(如信息增益)选择最佳划分点。
- 决策树易于理解和解释,但可能容易过拟合。
-
随机森林回归(Random Forest Regression):
- 随机森林回归是一种集成学习方法,通过构建多个决策树并对它们的预测结果进行平均来提高预测精度。
- 随机森林能够减少模型的方差,提高泛化能力,并且相对不容易过拟合。
-
梯度提升回归树(Gradient Boosting Regression Trees, GBRT):
- 梯度提升回归树是一种迭代的决策树算法,通过逐步添加新的树来修正前面树的预测错误。
- 每棵新树都尝试预测前面所有树的残差(真实值与当前预测值之间的差)。
- GBRT通常具有较高的预测精度,但也可能容易过拟合。
这些回归算法各有优势和适用场景,以下是一个使用线性回归进行预测的简单例子:
线性回归预测
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 生成一个简单的回归数据集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)# 划分训练集和测试集(略)
# ...# 初始化线性回归模型
linreg = LinearRegression()# 训练模型
linreg.fit(X_train, y_train)# 预测测试集
y_pred = linreg.predict(X_test)# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
五、模型评估与调优
sklearn还提供了丰富的模型评估工具和调优方法。可以使用交叉验证来评估模型的性能,使用网格搜索来找到最佳的模型参数。
交叉验证和网格搜索
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris# 加载iris数据集(略)
# ...# 初始化SVC模型
svc = SVC()# 使用5折交叉验证评估模型性能
scores = cross_val_score(svc, X, y, cv=5)
print(f"Cross-validation scores: {scores}")
print(f"Mean cross-validation score: {scores.mean()}")# 使用网格搜索找到最佳参数
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
clf = GridSearchCV(svc, parameters, cv=5)
clf.fit(X_train, y_train)
print(f"Best parameters: {clf.best_params_}")
print(f"Best score: {clf.best_score_}")
结语
这篇博客,介绍了解了sklearn库的基础知识,通过几个简单的例子展示了如何使用它进行数据处理、分类、回归以及模型评估与调优。当然,sklearn还提供了更多高级的功能和算法,如聚类、降维、异常检测等,这些都有待我们去探索和学习。希望这篇博客能作为学习sklearn的起点,助你在机器学习的道路上越走越远!
相关文章:

机器学习之sklearn基础教程
码到三十五 : 个人主页 机器学习库scikit-learn(简称sklearn)是Python中一个功能强大的机器学习库,它提供了大量用于数据挖掘和数据分析的工具,包括分类、回归、聚类、降维等算法。文中我们一起简单探讨sklearn的一些基…...

ES升级--04--SpringBoot整合Elasticsearch
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 SpringBoot整合Elasticsearch1.建立项目2.Maven 依赖[ES 官方网站:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html](…...

eclipse如何debug
步骤1:双击显示行数的数字来设置断点 步骤2:点击debug 步骤3:在弹出的窗口点击switch 步骤4:就可以调试了,右边是查看数据的,点击上面的图标进行下一步 步骤5:退出debug 步骤6:…...

无人售货机零售业务成功指南:从市场分析到创新策略
在科技驱动的零售新时代,无人售货机作为一种便捷购物解决方案,正逐步兴起,它不仅优化了消费者体验,还显著降低了人力成本,提升了运营效能。开展这项业务前,深入的市场剖析不可或缺,需聚焦消费者…...

开源代码分享(32)-基于改进多目标灰狼算法的冷热电联供型微电网运行优化
参考文献: [1]戚艳,尚学军,聂靖宇,等.基于改进多目标灰狼算法的冷热电联供型微电网运行优化[J].电测与仪表,2022,59(06):12-1952.DOI:10.19753/j.issn1001-1390.2022.06.002. 1.问题背景 针对冷热电联供型微电网运行调度的优化问题,为实现节能减排的目…...

7、架构-架构的安全性
即使只限定在“软件架构设计”这个语境下,系统安全仍然是一 个很大的话题。我们谈论的计算机系统安全,不仅仅是指“防御系统 被黑客攻击”这样狭隘的安全,还至少应包括(不限于)以下这些问 题的具体解决方案。 认证&am…...

LeetCode题练习与总结:路径总和Ⅱ--113
一、题目描述 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…...

Java复数计算
复数在数学、科学或者工程领域是很常用的,可以通过调用Apache Commons Math库来完成,也可以自己手撸。 一、使用Apache Commons Math库 这个库有多个版本,在写这篇文章时,它的最新版是2022年12月19日的4.0-beta1,构建…...

MySQL-事务日志
事务的隔离性由 锁机制 实现 事务的原子性、一致性、隔离性 由事务的 redo日志 和 undo 日志来保证 redo log 称为 重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。undo log 称为 回滚日志,回滚行记录…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类坐标点QPoint)
控件是PySide设计好的能承载用户输入、输出的小窗体,将多个控件有机整合,能形成用户所需要的界面。而每一个控件,都有属于自己的属性、方法、信号、槽函数和事件(event),且控件与控件之间又有继承关系。 G…...

算法练习——字符串
一确定字符串是否包含唯一字符 1.1涉及知识点 c的输入输出语法 cin>>s; cout<<"NO"; 如何定义字符串 切记:在[]中必须加数字——字符串最大长度,不然编译不通过 char s[101]; 如何获取字符串长度 char s[101];cin>>s;i…...

Flutter 中的 SliverOverlapInjector 小部件:全面指南
Flutter 中的 SliverOverlapInjector 小部件:全面指南 Flutter 是一个功能丰富的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的滚动视图系统中,SliverOverlapInjector 是一…...

7个Python爬虫入门小案例
大家好,随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。 一、爬虫原理 爬虫&a…...

linux 利用 ~$() 构造数字
2024.6.1 题目 <?php //flag in 12.php error_reporting(0); if(isset($_GET[x])){$x $_GET[x];if(!preg_match("/[a-z0-9;|#\"%&\x09\x0a><.,?*\-\\[\]]/i", $x)){system("cat ".$x.".php");} }else{highlight_file(__F…...

七大获取免费https的方式
想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后,浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书,又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…...

JVM(Java虚拟机)笔记
面试常见: 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取?怎么分析Dump文件?谈谈JVM中,类加载器你的认识…...

秒杀基本功能开发(显示商品列表和商品详情)
文章目录 1.数据库表设计1.商品表2.秒杀商品表3.修改一下秒杀时间为今天到明天 2.pojo和vo编写1.com/sxs/seckill/pojo/Goods.java2.com/sxs/seckill/pojo/SeckillGoods.java3.com/sxs/seckill/vo/GoodsVo.java 3.Mapper编写1.GoodsMapper.java2.GoodsMapper.xml3.分别编写Seck…...

centos 记录用户登陆ip和执行命令
centos 记录用户登陆ip和执行命令 在/etc/profile 文件末尾添加如下代码: #!/bin/bash USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g HISTDIR/usr/share/.history if [ -z "$USER_IP" ]; then USER_IPhostname fi…...

JZ2440笔记:DM9000C网卡驱动
在厂家提供的dm9dev9000c.c上修改, 1、注释掉#ifdef MODULE #endif 2、用模块化函数修饰入口出口函数 3、在dm9000c_init入口函数,增加iobase (int)ioremap(0x20000000,1024);irq IRQ_EINT7; 4、一路进入,在dmfe_probe1中注释掉if((db…...
【数据结构】二叉树:简约和复杂的交织之美
专栏引入: 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累…...

信号稳定,性能卓越!德思特礁鲨系列MiMo天线正式发布!
作者介绍 礁鲨系列天线,以其独特的外观设计和强大的性能,成为德思特Panorama智能天线家族的最新成员。这款天线不仅稳定提供5G、WIFI和GNSS信号,更能在各类复杂环境中展现出卓越的性能。它的设计灵感来源于海洋中的礁鲨,象征着力量…...

编程学习技巧——实战
目录 学习思路待续、更新中 学习思路 实战大小项目 翻阅官网手册——学习技术,调试问题 待续、更新中 1 顿号、: 先使用ctrl. ,再使用一遍切回 2 下标: 21 2~1~ 3 上标: 2 0 2^{0} 20 $2^{0}$ 4 竖线 | : | ; | 5 空格: &emsp ; 6 换行: &nbs…...

GPU学习(1)
一、为什么要GPU 我们先看一个基本的神经网络计算 YF(x)AxB 这就是一次乘法一次加法 ,也叫FMA,(fused multiply-add) 如果矩阵乘,就是上面的那个式子扩展一下,所以又用了这张老图 比如你要多执行好几个yAxB,可能比较简…...

TQSDRPI开发板教程:UDP收发测试
项目资源分享 链接:https://pan.baidu.com/s/1gWNSA9czrGwUYJXdeuOwgQ 提取码:tfo0 LWIP自环教程:https://blog.csdn.net/mcupro/article/details/139350727?spm1001.2014.3001.5501 在lwip自环的基础上修改代码实现UDP的收发测试。新建一…...

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer
算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型,由南洋理工大学和商汤科技联合研究中心联合开发,它能够接收模糊或马赛克图像作为输入,并生成更清晰的原始图像。算法源码地址:https://github.com/sczhou/CodeFormer…...

虚拟机改IP地址
使用场景:当你从另一台电脑复制一个VMware虚拟机过来,就是遇到一个问题,虚拟的IP地址不一样(比如,一个是192.168.1.3,另一个是192.168.2.4,由于‘1’和‘2’不同,不是同一网段&#…...

MySQL(二)-基础操作
一、约束 有时候,数据库中数据是有约束的,比如 性别列,你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话,肯定是不行的,人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求! 约…...

vue3学习使用笔记
1.学习参考资料 vue3菜鸟教程:https://www.runoob.com/vue3/vue3-tutorial.html 官方网站:https://cn.vuejs.org/ 中文文档: https://cn.vuejs.org/guide/introduction.html Webpack 入门教程:https://www.runoob.com/w3cnote/webpack-tutor…...

微信小程序怎么进行页面传参
微信小程序页面传参的方式有多种,每种方式都有其特定的使用场景和优势。以下是几种常见的页面传参方式,以及它们的具体使用方法和示例: URL参数传值 原理:通过在跳转链接中附加参数,在目标页面的onLoad函数中获取参数…...

隆道出席河南ClO社区十周年庆典,助推采购和供应链数字化发展
5月26日,“河南ClO社区十周年庆典”活动在郑州举办,北京隆道网络科技有限公司总裁助理姚锐出席本次活动,并发表主题演讲《数字化采购与供应链:隆道的探索与实践》,分享隆道公司在采购和供应链数字化转型方面的研究成果…...