Python机器学习:Scikit-learn入门指南-程序员宅基地

技术标签: python  架构  机器学习  scikit-learn  Python实践  分布式  

一、Scikit-learn简介

1. Scikit-learn是什么

Scikit-learn 是基于 Python 语言的机器学习工具库,它提供了诸如分类、回归、聚类等常用机器学习任务的 API,同时提供了许多常用的数据预处理工具和数据可视化工具。Scikit-learn 的设计旨在与 NumPy、SciPy 和 matplotlib 工具一起使用,因此可以轻松地与这些库进行集成。

2. Scikit-learn的优势及应用场景

Scikit-learn 提供了丰富成熟且易于使用的算法和工具,适用于各种机器学习任务。Scikit-learn 能够实现从数据预处理到模型选择、训练和评估等完整的机器学习工作流程。它也广泛应用于数据挖掘、预测建模、机器视觉、自然语言处理等领域。

3. Scikit-learn的安装

你可以使用 pip 命令通过以下命令来安装 Scikit-learn:

pip install -U scikit-learn

二、数据准备

1. 数据特征

在这个环节中需要根据你的具体任务首先对数据进行探查和描述,以确定哪些特征和标准可以用于构建模型。你可以使用 Pandas 库来加载数据集到 DataFrame 中,然后通过 head、describe 等方法来了解数据的基本情况:

import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 预览数据
print(df.head())

# 描述数据
print(df.describe())

2. 数据清洗

在数据清洗阶段中我们会删除无用的列、处理缺失的数据和异常值等。可以使用 Pandas 库的 drop、fillna 等方法来处理数据:

import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

3. 数据划分

在机器学习任务中通常需要将数据集划分为训练集和测试集。你可以使用 Scikit-learn 库来进行数据划分:

from sklearn.model_selection import train_test_split
import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('label', axis=1), df['label'], random_state=42)

三、模型训练

1. 模型选择

在模型选择环节中需要根据任务的性质、数据的分布以及性能需求等选择最适合的模型。Scikit-learn 提供了许多常用的机器学习算法,我们可以从中选择适合我们任务的算法,比如:

from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier

clf1 = SVC()
clf2 = KNeighborsClassifier()
clf3 = RandomForestClassifier()

2. 模型训练

选定好模型后需要使用训练数据来训练模型。Scikit-learn 提供了 fit 方法来进行模型训练:

from sklearn.svm import SVC
import pandas as pd

# 导入数据集到 DataFrame
df = pd.read_csv('data.csv')

# 删除无用的列
df = df.drop(['id', 'timestamp'], axis=1)

# 处理缺失的数据
df = df.fillna(df.mean())

# 处理异常值
df = df[(df['value'] >= 0) & (df['value'] <= 100)]

# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('label', axis=1), df['label'], random_state=42)

# 初始化 SVM 模型
clf = SVC(kernel='linear', C=1)

# 训练模型
clf.fit(X_train, y_train)

3. 模型评估

在模型评估环节中需要使用测试集来评估模型的性能。Scikit-learn 提供了 score 方法和混淆矩阵等评估方法:

from sklearn.metrics import accuracy_score, confusion_matrix

# 用测试集评估模型的性能
y_pred = clf.predict(X_test)
print('Accuracy:', accuracy_score(y_test, y_pred))
print('Confusion Matrix:', confusion_matrix(y_test, y_pred))

四、机器学习算法

1. 监督学习算法

1.1 线性回归

线性回归模型是一种对于线性关系建模的机器学习算法。它可用于预测连续的数值型变量如销售额、股票价格等。下面是一个使用 scikit-learn 库实现线性回归的示例:

from sklearn.linear_model import LinearRegression

# 建立线性回归模型
model = LinearRegression()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

1.2 逻辑回归

逻辑回归模型是一种对于二分类问题建模的机器学习算法。它可用于预测一个事件发生的概率。下面是一个使用 scikit-learn 库实现逻辑回归的示例:

from sklearn.linear_model import LogisticRegression

# 建立逻辑回归模型
model = LogisticRegression()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

1.3 决策树

决策树是一种基于树形结构进行决策的机器学习算法。它可用于分类和回归问题其优点在于易于理解和解释。下面是一个使用 scikit-learn 库实现决策树的示例:

from sklearn.tree import DecisionTreeClassifier

# 建立决策树模型
model = DecisionTreeClassifier(max_depth=2)

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

1.4 支持向量机

支持向量机是一种基于边际最大化进行分类的机器学习算法。它可用于分类和回归问题其优点在于高准确性和鲁棒性。下面是一个使用 scikit-learn 库实现支持向量机的示例:

from sklearn.svm import SVC

# 建立支持向量机模型
model = SVC(kernel='linear')

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

1.5 随机森林

随机森林是一种基于决策树进行分类和回归的机器学习算法。它可用于处理高维度和大规模数据集。下面是一个使用 scikit-learn 库实现随机森林的示例:

from sklearn.ensemble import RandomForestClassifier

# 建立随机森林模型
model = RandomForestClassifier(n_estimators=100)

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

2. 非监督学习算法

2.1 主成分分析

主成分分析是一种用于数据降维的机器学习算法。它通过线性变换将高维度数据转换为低维度数据,并且保留了大多数的变异性。下面是一个使用 scikit-learn 库实现主成分分析的示例:

from sklearn.decomposition import PCA

# 建立主成分分析模型
model = PCA(n_components=2)

# 将数据转化为低维度
X_pca = model.fit_transform(X)

2.2 聚类分析

聚类分析是一种用于将数据集分组的机器学习算法。它可用于发现数据集中的不同模式和群组。下面是一个使用 scikit-learn 库实现聚类分析的示例:

from sklearn.cluster import KMeans

# 建立聚类分析模型
model = KMeans(n_clusters=3)

# 训练模型
model.fit(X)

# 预测结果
y_pred = model.predict(X)

五、实战案例

1. 分类问题

一个使用决策树算法处理鸢尾花分类问题的示例:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 导入鸢尾花数据集
iris = load_iris()

# 建立决策树分类模型
model = DecisionTreeClassifier()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

# 计算准确率
print('Accuracy:', accuracy_score(y_test, y_pred))

2. 回归问题

一个使用随机森林算法处理波士顿房价回归问题的示例:

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 建立随机森林回归模型
model = RandomForestRegressor()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=0)

# 训练模型
model.fit(X_train, y_train)

# 预测结果
y_pred = model.predict(X_test)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(y_test, y_pred))

六、Scikit-learn进阶

1. 流水线

当我们需要处理的数据非常庞大时很容易将数据导入,并挑选和训练不同的模型。在这些过程中可能需要对数据进行预处理,如标准差规范化或者归一化等。Scikit-learn提供了一个Pipeline API,让我们可以将整个过程用代码整合起来,方便调用。

以下是一个流水线示例:

from sklearn.pipeline import Pipeline
from sklearn.feature_selection import SelectKBest
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris

# 导入鸢尾花数据集
iris = load_iris()

# 建立Pipeline
pipeline = Pipeline([
    ('reduce_dim', PCA()),
    ('classify', LogisticRegression())
])

# 建立参数搜索空间
param_grid = {
    
    'reduce_dim__n_components': [2, 4, 8],
    'classify__C': [0.1, 1, 10]
}

# 在流水线中使用GridSearchCV调整参数
grid = GridSearchCV(pipeline, cv=5, n_jobs=-1, param_grid=param_grid)
grid.fit(iris.data, iris.target)

# 输出最佳参数
print(grid.best_params_)

2. 模型调参

当我们使用Scikit-learn中的某个模型时需要对该模型的超参数进行适当的调整,以获得最佳表现。Scikit-learn中提供了不同的调整方法,如Grid Search和Random Search等。具体使用哪种方法取决于数据的规模和要求。

以下是一个使用Grid Search调整模型的示例:

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 建立随机森林回归模型
model = RandomForestRegressor()

# 建立参数搜索空间
param_grid = {
    
    'n_estimators': [10, 50, 100],
    'max_depth': [None, 2, 5]
}

# 在模型中使用GridSearchCV调整参数
grid = GridSearchCV(model, cv=5, n_jobs=-1, param_grid=param_grid)
grid.fit(boston.data, boston.target)

# 预测结果
y_pred = grid.predict(boston.data)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(boston.target, y_pred))

3. 特征选择

在实际应用中不是所有的特征都具有相同的重要性。有些特征可能比其他特征更具有预测性。特征选择是一个用于选择最重要的特征的技术。Scikit-learn提供了很多特征选择工具,如SelectKBest、Recursive Feature Elimination和SelectFromModel等。

以下是一个使用SelectKBest选择特征的示例:

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

# 导入波士顿房价数据集
boston = load_boston()

# 选择最重要的5个特征
selector = SelectKBest(f_regression, k=5)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=0)

# 选择特征
X_train_selected = selector.fit_transform(X_train, y_train)
X_test_selected = selector.transform(X_test)

# 建立线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train_selected, y_train)

# 预测结果
y_pred = model.predict(X_test_selected)

# 计算平均绝对误差
print('MAE:', mean_absolute_error(y_test, y_pred))

七、小结回顾

1. Scikit-learn的优缺点

Scikit-learn具有以下优点:

  • 它具有用于一般机器学习问题的全面工具包;
  • 几乎所有的算法都可以通过统一的API来使用,使用户能够更好地理解和使用这些算法;
  • 具有大量的文档和示例,使得使用Scikit-learn变得更为简单易用;
  • 它对分布式计算的支持很好,可以轻松地扩展到大规模数据集;
  • Scikit-learn的代码是开源的。

Scikit-learn也有一些缺点:

  • 由于它依赖于Python,因此相对于C++或Java等语言,Scikit-learn运行效率较低;
  • 它尚未完全支持大规模深度学习模型。

2. 未来发展方向

随着人工智能的发展机器学习和数据科学也将取得进一步发展。Scikit-learn将继续是许多人入门机器学习的重要工具之一。在未来,我们可以期待更多的算法被添加到Scikit-learn工具包中,并且它会更好地支持大规模和高性能计算。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010349629/article/details/130663015

智能推荐

某鱼wasm逆向_某鱼 逆向-程序员宅基地

文章浏览阅读1.2k次,点赞18次,收藏15次。斗鱼、wasm、js逆向、web逆向。_某鱼 逆向

sicily1029 Rabbit 中大OJ解题报告-程序员宅基地

文章浏览阅读737次。由于中大的oj需要内网才能进去,就提供不了原始题目了,但是题目的意思就是说,开始有一对成年兔子,一对成年兔子每年能生一对幼兔,幼兔等m个月才成长为成年兔子,问d个月后总共有多少对兔子。输入m d 2 3 3 5 1 100输出 5 9 100题目意思相信大家都能明白,那么解题思路又是怎么样的呢我来大概说一下,先找到兔子增长_中大oj

C程序设计第五版谭浩强 || 第四章习题答案-程序员宅基地

文章浏览阅读1.5k次,点赞40次,收藏34次。【代码】C程序设计第五版谭浩强 || 第四章习题答案

CPO-CNN-LSTM分类预测,【24新算法】冠豪猪算法CPO优化卷积神经网络-长短期记忆网络多特征分类预测-程序员宅基地

文章浏览阅读161次。CPO-CNN-LSTM分类预测,【24新算法】冠豪猪算法CPO优化卷积神经网络-长短期记忆网络多特征分类预测

非Root或Administrator账户下运行Nginx_nginx用什么用户启动-程序员宅基地

文章浏览阅读1.4k次。这样,就可以在CentOS系统中使用普通用户身份来管理和启动Nginx服务了。请注意,对于其他需要管理员权限才能完成的操作(如修改系统文件等),还需要使用sudo命令或者切换到管理员账户进行操作。下载并安装Nginx,保证Nginx可执行文件所在的路径对普通用户具有可读、可执行的权限。安装过程中,在指定 Nginx 配置文件路径时要特别注意,确保可访问并正确填写。启动Nginx服务。是您实际安装Nginx时配置文件存放的路径。_nginx用什么用户启动

【解决】无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]_无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[h-程序员宅基地

文章浏览阅读6.8k次。问题描述:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]在调用<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>时出现异常调用tomcat服务器时,页面出错:原因分析:首先确认导入的jar包是否正确经过多次导包还是老样子,在网上也找了挺多方法,但都不凑效解决方案:方案一:重新导入jar包如果是jar包缺失_无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[h

随便推点

pipenv—不可不知的python包管理利器-程序员宅基地

文章浏览阅读258次。一 前言最近我们的檀神在学习python时提了一个很好的问题,让我觉得有必要把它梳理下分享给更多的学习者。剧情回顾:檀神安装了python3的版本,想在我16年基于python2写的工具的基础上增加功能,但发现工具的一个模块还不支持python3。这就尴尬了,是要重装python2的版本?还是用python3的模块重写工具?不管哪种方式,似乎都挺折腾。其实,这只是python..._launching subshell in virtual environment... windows powershell 版权所有(c)

Oracle列转行函数 Listagg() 语法详解及应用实例_oracle9 listagg-程序员宅基地

文章浏览阅读6w次,点赞12次,收藏65次。工作中用到一段比较复杂的SQL查询脚本,使用了listagg()函数实现了具有多个值的字段的填充(即,列表聚合,list aggregation(我猜的))。说简单点,listagg()函数可以实现多列记录聚合为一条记录,从而实现数据的压缩、致密化(data densification)。以下内容转载自http://dacoolbaby.iteye.com/blog/1698957,SQL脚本做了..._oracle9 listagg

InnoDB在SQL查询中的关键功能和优化策略-程序员宅基地

文章浏览阅读1.9k次,点赞41次,收藏32次。通过上篇文章《MySQL的体系结构与SQL的执行流程》了解了SQL语句的执行流程以及MySQL体系结构中**「连接器」「SQL接口」「解析器」「优化器」「执行器」**的功能以及在整个流程中的作用。不过上篇文章留了个尾巴,在执行器调用存储引擎后,存储引擎内部做了什么事没有进一步说明,本文会对此展开介绍,使得我们对SQL整体的执行流程有更加清晰的认识。先了解下存储引擎是干什么的。

优动漫PAINT-超简单灌木教程-程序员宅基地

文章浏览阅读93次。超简单灌木教程~零基础神马的都能神还原哦!优动漫PAINT下载:http://wm.makeding.com/iclk/?zoneid=18597想要Get到更多有关优动漫的信息包括软件下载,可关注优动漫PAINT中文官网哦!转载于:https://www.cnblogs.com/danzi/p/8527177.html..._优动漫边缘上色

Netty 1-程序员宅基地

文章浏览阅读716次,点赞24次,收藏27次。Channel与BufferJava NIO系统的核心通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理简而言之,通道负责传输,缓冲区负责存储常见的Channel有以下四种,其中FileChannel主要用于文件传输,其余三种用于网络通信Buffer有以下几种,其中使用较多的是ByteBufferByteBuffer。

VS 设置 C# 以下划线 _ 开头命名全局字段_visual studio 命名规则以_开头给-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏5次。VS 设置 C# 以下划线 _ 开头命名全局字段设置方法之前在某位大神的博客有看到这个设置方法,换电脑以后再找那个文章却找不到了,按回忆找到了设置方法,故写出来分享给大家。private readonly SearchResult _searchResult;设置方法以2019企业版为例,找到:工具 - 选项 - 文本编辑器 - C# - 代码样式 - 命名点击“管理命名样式”,然后再点左下角加号,新建一个命名规范,标题可以自己拟定,设置“必填前缀”为“_”,选择“camel 事例名称”,确_visual studio 命名规则以_开头给

推荐文章

热门文章

相关标签