🎩 欢迎来到技术探索的奇幻世界👨💻
📜 个人主页:@一伦明悦-CSDN博客
✍🏻 作者简介: C++软件开发、Python机器学习爱好者
🗣️ 互动与支持:💬评论 👍🏻点赞 📂收藏 👀关注+
如果文章有所帮助,欢迎留下您宝贵的评论,点赞加收藏支持我,点击关注,一起进步!
目录
前言
正文
01-Scikit-Learn简介
02-Sklearn实现有监督学习
03-Sklearn实现无监督学习
04-Sklearn实现模型选择与评估
05-Sklearn实现基于排列的特征重要性
06-Sklearn实现带有可视化API的ROC曲线
07-Sklearn实现数据集转换
总结
前言
Scikit-Learn(也称为sklearn)是一个用于机器学习的Python库,提供了丰富的工具和算法,用于数据预处理、模型选择、评估和部署。Scikit-Learn是一个开源的机器学习库,它支持有监督和无监督的学习。它还提供了用于模型拟合,以及许多其他实用程序的各种工具。
下面链接为scikit-learn工具包的中文社区,里面包含了该工具包可以实现的各种功能,并给出了实例进行分析使用过程,通过这里的学习可以更快的掌握工具包的使用方法,非常适用于机器学习初始学习者。
scikit-learn中文社区https://scikit-learn.org.cn/
附上Scikit-Learn工具包的所有API链接:
- sklearn.base:基类和实用程序函数https://scikit-learn.org.cn/lists/3.html#sklearn.base%EF%BC%9A%E5%9F%BA%E7%B1%BB%E5%92%8C%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%87%BD%E6%95%B0
- sklearn.calibration:概率校准https://scikit-learn.org.cn/lists/3.html#sklearn.calibration%EF%BC%9A%E6%A6%82%E7%8E%87%E6%A0%A1%E5%87%86
- sklearn.cluster:聚类https://scikit-learn.org.cn/lists/3.html#sklearn.cluster%EF%BC%9A%E8%81%9A%E7%B1%BB
- sklearn.compose:复合估计器https://scikit-learn.org.cn/lists/3.html#sklearn.compose%EF%BC%9A%E5%A4%8D%E5%90%88%E4%BC%B0%E8%AE%A1%E5%99%A8
- sklearn.covariance:协方差估计器https://scikit-learn.org.cn/lists/3.html#sklearn.covariance%EF%BC%9A%E5%8D%8F%E6%96%B9%E5%B7%AE%E4%BC%B0%E8%AE%A1%E5%99%A8
- sklearn.cross_decomposition:交叉分解https://scikit-learn.org.cn/lists/3.html#sklearn.cross_decomposition%EF%BC%9A%E4%BA%A4%E5%8F%89%E5%88%86%E8%A7%A3
- sklearn.datasets:数据集https://scikit-learn.org.cn/lists/3.html#sklearn.datasets%EF%BC%9A%E6%95%B0%E6%8D%AE%E9%9B%86
- sklearn.decomposition:矩阵分解https://scikit-learn.org.cn/lists/3.html#sklearn.decomposition%EF%BC%9A%E7%9F%A9%E9%98%B5%E5%88%86%E8%A7%A3
- sklearn.discriminant_analysis:判别分析https://scikit-learn.org.cn/lists/3.html#sklearn.discriminant_analysis%EF%BC%9A%E5%88%A4%E5%88%AB%E5%88%86%E6%9E%90
- sklearn.dummy:虚拟估计器https://scikit-learn.org.cn/lists/3.html#sklearn.dummy%EF%BC%9A%E8%99%9A%E6%8B%9F%E4%BC%B0%E8%AE%A1%E5%99%A8
- sklearn.ensemble:集成方法https://scikit-learn.org.cn/lists/3.html#sklearn.ensemble%EF%BC%9A%E9%9B%86%E6%88%90%E6%96%B9%E6%B3%95
- sklearn.exceptions:异常和警告https://scikit-learn.org.cn/lists/3.html#sklearn.exceptions%EF%BC%9A%E5%BC%82%E5%B8%B8%E5%92%8C%E8%AD%A6%E5%91%8A
- sklearn.experimental:实验https://scikit-learn.org.cn/lists/3.html#sklearn.experimental%EF%BC%9A%E5%AE%9E%E9%AA%8C
- sklearn.feature_extraction特征提取https://scikit-learn.org.cn/lists/3.html#sklearn.feature_extraction%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96
- sklearn.feature_selection:特征选择https://scikit-learn.org.cn/lists/3.html#sklearn.feature_selection%EF%BC%9A%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9
- sklearn.gaussian_process:高斯过程https://scikit-learn.org.cn/lists/3.html#sklearn.gaussian_process%EF%BC%9A%E9%AB%98%E6%96%AF%E8%BF%87%E7%A8%8B
- sklearn.impute:插补https://scikit-learn.org.cn/lists/3.html#sklearn.impute%EF%BC%9A%E6%8F%92%E8%A1%A5
- sklearn.inspection:检查https://scikit-learn.org.cn/lists/3.html#sklearn.inspection%EF%BC%9A%E6%A3%80%E6%9F%A5
- sklearn.isotonic:等渗回归https://scikit-learn.org.cn/lists/3.html#sklearn.isotonic%EF%BC%9A%E7%AD%89%E6%B8%97%E5%9B%9E%E5%BD%92
- sklearn.kernel_approximation内核近似https://scikit-learn.org.cn/lists/3.html#sklearn.kernel_approximation%E5%86%85%E6%A0%B8%E8%BF%91%E4%BC%BC
- sklearn.kernel_ridge内核岭回归https://scikit-learn.org.cn/lists/3.html#sklearn.kernel_ridge%E5%86%85%E6%A0%B8%E5%B2%AD%E5%9B%9E%E5%BD%92
- sklearn.linear_model:线性模型https://scikit-learn.org.cn/lists/3.html#sklearn.linear_model%EF%BC%9A%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B
- sklearn.manifold:流形学习https://scikit-learn.org.cn/lists/3.html#sklearn.manifold%EF%BC%9A%E6%B5%81%E5%BD%A2%E5%AD%A6%E4%B9%A0
- sklearn.metrics:指标https://scikit-learn.org.cn/lists/3.html#sklearn.metrics%EF%BC%9A%E6%8C%87%E6%A0%87
- sklearn.mixture:高斯混合模型https://scikit-learn.org.cn/lists/3.html#sklearn.mixture%EF%BC%9A%E9%AB%98%E6%96%AF%E6%B7%B7%E5%90%88%E6%A8%A1%E5%9E%8B
- sklearn.model_selection:模型选择https://scikit-learn.org.cn/lists/3.html#sklearn.model_selection%EF%BC%9A%E6%A8%A1%E5%9E%8B%E9%80%89%E6%8B%A9
- sklearn.multiclass:多类和多标签分类https://scikit-learn.org.cn/lists/3.html#sklearn.multiclass%EF%BC%9A%E5%A4%9A%E7%B1%BB%E5%92%8C%E5%A4%9A%E6%A0%87%E7%AD%BE%E5%88%86%E7%B1%BB
- sklearn.multioutput:多输出回归和分类https://scikit-learn.org.cn/lists/3.html#sklearn.multioutput%EF%BC%9A%E5%A4%9A%E8%BE%93%E5%87%BA%E5%9B%9E%E5%BD%92%E5%92%8C%E5%88%86%E7%B1%BB
- sklearn.naive_bayes:朴素贝叶斯https://scikit-learn.org.cn/lists/3.html#sklearn.naive_bayes%EF%BC%9A%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF
- sklearn.neighbors:最近邻https://scikit-learn.org.cn/lists/3.html#sklearn.neighbors%EF%BC%9A%E6%9C%80%E8%BF%91%E9%82%BB
- sklearn.neural_network:神经网络模型https://scikit-learn.org.cn/lists/3.html#sklearn.neural_network%EF%BC%9A%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B
- sklearn.pipeline:管道https://scikit-learn.org.cn/lists/3.html#sklearn.pipeline%EF%BC%9A%E7%AE%A1%E9%81%93
- sklearn.preprocessing:预处理和规范化https://scikit-learn.org.cn/lists/3.html#sklearn.preprocessing%EF%BC%9A%E9%A2%84%E5%A4%84%E7%90%86%E5%92%8C%E8%A7%84%E8%8C%83%E5%8C%96
- sklearn.random_projection:随机投影https://scikit-learn.org.cn/lists/3.html#sklearn.random_projection%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%8A%95%E5%BD%B1
- sklearn.semi_supervised半监督学习https://scikit-learn.org.cn/lists/3.html#sklearn.semi_supervised%E5%8D%8A%E7%9B%91%E7%9D%A3%E5%AD%A6%E4%B9%A0
- sklearn.svm:支持向量机https://scikit-learn.org.cn/lists/3.html#sklearn.svm%EF%BC%9A%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA
- sklearn.tree:决策树https://scikit-learn.org.cn/lists/3.html#sklearn.tree%EF%BC%9A%E5%86%B3%E7%AD%96%E6%A0%91
- sklearn.utils:实用工具https://scikit-learn.org.cn/lists/3.html#sklearn.utils%EF%BC%9A%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7
注:由于Scikit-Learn工具包包含机器学习所需要的众多功能,一篇难以做出更加详细的分析,因此,在本篇中仅对Scikit-Learn中可以使用的功能进行简要分析,后续更新每种功能更加详细的使用过程。
正文
01-Scikit-Learn简介
Scikit-Learn是一个用于机器学习的Python库,它提供了各种用于数据预处理、模型选择、评估和部署的工具和算法。这个库的设计重点是简单、高效和可扩展性。
(1)Scikit-Learn的简单易用性使得用户可以轻松地使用各种机器学习算法,无需深入了解算法的底层实现。其一致的API设计使得算法的调用和使用变得简单直观。这种设计思想使得Scikit-Learn成为许多数据科学从业者和研究人员的首选工具之一。
(2)Scikit-Learn提供了广泛的算法支持,包括回归、分类、聚类、降维等各种机器学习任务的算法。无论您是处理结构化数据还是文本数据,Scikit-Learn都能提供适合的算法和工具。从传统的线性模型到现代的深度学习算法,Scikit-Learn都能涵盖您所需的范围。
(3)Scikit-Learn还提供了丰富的功能,如特征选择、模型评估、交叉验证、管道等,帮助用户完成整个机器学习流程。这些功能使得用户可以更好地处理数据、选择模型、评估性能,并优化整个机器学习流程。
(4)Scikit-Learn的性能优化也值得一提。其底层实现经过优化,训练和预测速度较快,能够处理大规模数据集。这使得Scikit-Learn成为处理大数据集和复杂模型的理想选择。
(5)Scikit-Learn与其他Python科学计算库(如NumPy、SciPy和Matplotlib)以及数据处理库(如Pandas)无缝集成,使得用户可以方便地进行数据处理、可视化和模型评估。这种集成性使得用户可以更加高效地完成整个机器学习流程。
下面是Scikit-Learn的一些主要特点和功能:
a、简单易用: Scikit-Learn提供了简单且一致的API,使得用户可以轻松地使用各种机器学习算法,无需深入了解算法的底层实现。
b、广泛的算法支持: Scikit-Learn包含了许多经典的机器学习算法,包括回归、分类、聚类、降维等。这些算法涵盖了从传统的线性模型到最新的深度学习算法的全面范围。
c、丰富的功能: 除了基本的机器学习算法外,Scikit-Learn还提供了许多辅助功能,如特征选择、模型评估、交叉验证、管道等,帮助用户完成整个机器学习流程。
d、性能优化: Scikit-Learn采用了优化的底层实现,使得训练和预测速度较快,可以处理大规模数据集。
e、与其他Python库的集成: Scikit-Learn与其他Python科学计算库(如NumPy、SciPy和Matplotlib)以及数据处理库(如Pandas)无缝集成,使得用户可以方便地进行数据处理、可视化和模型评估。
安装scikit-learn方法:两种方法安装最新版本
操作系统:Windows
包管理器:pip
例如从https://www.python.org上安装Python 3的64位版本。
然后运行如下代码:
pip install -U scikit-learn
使用以下语句去检查:
python -m pip show scikit-learn # 查看scikit-learn安装的位置及安装的版本
python -m pip freeze # 查看所有在虚拟环境中已下载的包
python -c "import sklearn; sklearn.show_versions()"
操作系统:Windows
包管理器:conda
安装 conda (不需要管理员权限)安装 conda
然后运行:
conda install scikit-learn
使用以下语句去检查:
conda list scikit-learn # 查看scikit-learn安装的位置及安装的版本
conda list # 查看所有在虚拟环境中已下载的包
python -c "import sklearn; sklearn.show_versions()"
下面给出一个较为常见的例子进行分析该工具包的使用过程:在这个例子中,我们导入了NumPy库用于数据处理,以及Scikit-Learn的LinearRegression类用于线性回归模型。我们创建了一些示例数据X和y,然后使用fit方法训练模型,最后使用predict方法进行预测。
# 导入必要的库
import numpy as np
from sklearn.linear_model import LinearRegression# 创建一些示例数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])# 创建线性回归模型
model = LinearRegression()# 训练模型
model.fit(X, y)# 进行预测
y_pred = model.predict([[6], [7]])print(y_pred)
02-Sklearn实现有监督学习
Scikit-Learn提供了丰富的工具和算法用于有监督学习任务,包括回归和分类。下面我们将详细解释有监督学习的实现,并通过一个经典的线性回归例子进行分析,并可视化数据和模型预测结果。
有监督学习的主要步骤包括数据准备、模型选择、训练和预测。我们以一个简单的线性回归为例,展示整个过程。
数据准备: 首先,我们需要准备数据。在这个例子中,我们创建一个随机的线性数据集,并划分为训练集和测试集。
模型选择: 接下来,我们选择一个回归模型来拟合数据。在这里,我们选择使用线性回归模型。
训练模型: 我们使用训练集对模型进行训练,来拟合数据。
预测: 最后,我们使用训练好的模型对测试集进行预测,并评估模型性能。
具体代码如下:代码演示了一个典型的有监督学习过程,使用了Scikit-Learn进行线性回归任务的实现。
a、数据准备:首先,使用NumPy生成了一个随机的线性数据集,其中X是一个在0到2之间均匀分布的随机数列,而y是对应的线性关系加上一些噪声。
b、训练集和测试集划分:利用train_test_split
函数将数据集划分为训练集和测试集,其中测试集占总数据集的20%。
c、选择模型:这里选择了线性回归模型作为拟合数据的模型,使用Scikit-Learn的LinearRegression
类。
d、模型训练:使用训练集数据对线性回归模型进行训练,以找到最优的拟合参数。
e、模型预测:利用训练好的模型对测试集进行预测,得到对应的预测结果y_pred
。
f、可视化:最后,利用Matplotlib库将测试集的真实数据点以蓝色散点图的形式显示出来,并在同一图中用红色线条表示模型对测试集的预测结果。横轴为X值,纵轴为对应的y值,标题为"线性回归模型"。这样的可视化结果使我们能够直观地看到模型的拟合效果。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 创建随机线性数据集
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.rand(100, 1)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建线性回归模型
model = LinearRegression()# 训练模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 可视化
plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('线性回归模型')
plt.savefig("../1.png", dpi=500)
plt.show()
实例运行结果如下图所示:
03-Sklearn实现无监督学习
Sklearn提供了许多用于无监督学习任务的工具和算法,其中最常见的包括聚类和降维。我们将通过一个经典的聚类算法K均值(K-Means)来演示无监督学习的实现过程,并对结果进行可视化。
无监督学习通常用于从数据中发现模式和结构,而不需要预先标记数据。K均值是一种常用的聚类算法,用于将数据点分成K个簇。
数据准备: 首先,我们生成一些随机的数据来进行聚类。
选择模型: 在这里,我们选择K均值算法作为聚类模型。
模型训练: 使用K均值算法对数据进行聚类。
可视化:最后,我们用不同颜色的散点图将聚类的结果进行可视化,以帮助理解聚类效果。
具体代码如下:代码展示了如何使用Scikit-Learn实现无监督学习任务,以K均值算法为例进行了详细解释和演示。
a、数据准备:首先,通过numpy
生成了一个包含100个数据点的随机数据集X
,每个数据点有两个特征。
b、选择模型:选择了K均值算法作为聚类模型,使用Scikit-Learn的KMeans
类来实现。
c、模型训练:调用fit
方法对数据进行聚类,K均值算法会将数据点分成指定数量的簇。
d、可视化:最后,利用matplotlib
库将聚类的结果可视化出来。每个数据点被归属到不同的簇,并用不同的颜色表示,这有助于直观地观察聚类效果。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 生成随机数据
X = np.random.rand(100, 2)# 创建K均值模型
model = KMeans(n_clusters=3)# 训练模型
model.fit(X)# 预测簇标签
labels = model.labels_# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title('K-均值聚类')
plt.xlabel('X1')
plt.ylabel('X2')
plt.savefig("../2.png", dpi=500)
plt.show()
实例运行结果如下图所示:
04-Sklearn实现模型选择与评估
Sklearn提供了许多模型选择和评估的工具,包括交叉验证、超参数调优等方法。在这里,我们将以经典的决策树模型为例进行详细解释和演示。
模型选择与评估流程:
数据准备:首先,我们加载一个经典的鸢尾花(Iris)数据集,这个数据集包含了三类不同的鸢尾花样本,每个样本有四个特征。
选择模型:这里我们选择了决策树(Decision Tree)作为分类模型。
交叉验证:使用交叉验证(Cross-Validation)方法来评估模型的性能。在这里我们使用K折交叉验证(K-Fold Cross Validation)来分割训练集。
超参数调优:通过交叉验证,我们可以调整模型的超参数来提高性能。这里我们选择树的最大深度作为超参数进行调优。
模型训练与评估:训练最优模型并评估性能。
可视化:最后,我们用图形化的方式展示出决策树模型的结构,以便更好地理解该模型的决策过程。
具体代码如下:代码展示了如何使用Scikit-Learn实现模型选择与评估的流程,以决策树分类器为例进行了详细解释和演示。
a、数据准备:首先,通过load_iris()
函数加载了鸢尾花数据集,其中包含了150个样本,每个样本有四个特征,对应着花萼和花瓣的长度和宽度。数据集中共有三种不同的鸢尾花,分别为Setosa、Versicolour和Virginica,对应着0、1、2三个类别。
b、选择模型:在这个例子中,我们选择了决策树分类器作为模型,使用Scikit-Learn的DecisionTreeClassifier
类来实现。
c、交叉验证:我们使用了5折交叉验证(5-Fold Cross Validation)来评估模型的性能。cross_val_score
函数返回了模型在每个交叉验证折叠上的得分,这里我们打印出了交叉验证的得分。
d、超参数调优:为了提高模型性能,我们通过网格搜索(Grid Search)方法对决策树的最大深度进行调优。我们定义了一个参数网格param_grid
,包含了最大深度从1到9的候选值。然后使用GridSearchCV
类来进行网格搜索,找到最佳参数组合。打印出了找到的最佳参数值。
e、模型训练与评估:使用交叉验证得到的最佳超参数,我们重新训练了一个最优的决策树模型,并将其存储在best_model
变量中。
f、可视化:最后,我们通过plot_tree
函数将最优决策树模型的结构进行可视化。通过这个图,可以直观地看到每个节点的判断条件以及分支情况,有助于理解决策树模型的决策过程和逻辑。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.tree import plot_tree# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 创建决策树模型
model = DecisionTreeClassifier()# 交叉验证评估模型性能
scores = cross_val_score(model, X, y, cv=5)
print("Cross-Validation Scores:", scores)# 超参数调优
param_grid = {'max_depth': np.arange(1, 10)}
grid = GridSearchCV(model, param_grid, cv=5)
grid.fit(X, y)
print("Best Parameters:", grid.best_params_)# 训练最优模型
best_model = grid.best_estimator_# 绘制决策树
plt.figure(figsize=(12, 8))
plot_tree(best_model, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.savefig("../3.png", dpi=500)
plt.show()# 输出结果为
Cross-Validation Scores: [0.96666667 0.96666667 0.9 0.96666667 1. ]
Best Parameters: {'max_depth': 5}
实例运行结果如下图所示: 该图展示了一棵深度为3的决策树,每个内部节点表示一个特征和一个阈值,根据这个条件将数据分配到不同的子节点,直到叶节点,叶节点表示了最终的分类结果。通过观察这个图,可以清晰地理解模型是如何根据特征来进行分类的。
05-Sklearn实现基于排列的特征重要性
基于排列的特征重要性是一种模型检查技术,可用于表格型数据中任一个拟合的估计器 。 这对于非线性或不可解释的估计器特别有用 。基于排列的特征重要性定义为单个特征取值被随机打乱时模型得分的降低程度。此过程破坏了特征与目标之间的关系,因此模型得分的下降程度表示了模型对特征的依赖程度。这种技术的好处在于它不依赖于模型,并且可以通过特征的不同排列进行多次计算。
Permutation_Importance函数可以计算给定数据集的估计器的特征重要性。n_repeats
参数设置特征取值随机重排的次数,并返回样本的特征重要性。
下面将以随机森林模型为例进行详细解释和演示。
Permutation Importance方法流程:
数据准备:首先,我们加载一个经典的波士顿房价数据集,这个数据集包含了房屋的各项特征(比如房间数量、犯罪率等)以及房价作为目标变量。
选择模型:在这个例子中,我们选择了随机森林(Random Forest)回归模型作为模型。
训练模型:使用波士顿房价数据集训练随机森林回归模型。
计算特征重要性:利用Permutation Importance方法计算各个特征的重要性,方法是对每个特征进行随机排列,观察模型预测性能的变化,重要性高的特征对模型影响较大。
可视化:最后,我们通过图表展示各个特征的重要性,以便更直观地理解模型特征对预测的影响。
具体代码如下:代码展示了如何使用Sklearn的Permutation Importance方法来评估模型中特征的重要性。下面是代码的详细解释:
a、数据准备:首先,我们通过load_boston()
函数加载了波士顿房价数据集,其中包含了房屋的各项特征(比如房间数量、犯罪率等)以及房价作为目标变量。boston.data
包含了特征数据,boston.target
包含了目标变量。
b、选择模型:在这个例子中,我们选择了随机森林回归模型作为模型,使用Scikit-Learn的RandomForestRegressor
类来实现。
c、训练模型:使用波士顿房价数据集训练了随机森林回归模型,通过model.fit(X, y)
完成模型训练。
d、计算特征重要性:利用permutation_importance()
函数计算各个特征的重要性。这个函数会对每个特征进行随机排列,然后观察模型预测性能的变化,重要性高的特征对模型影响较大。n_repeats
参数指定了重复计算次数,random_state
参数用于设置随机种子以确保结果的稳定性。
e、可视化:最后,通过条形图展示了各个特征的重要性。result.importances_mean
包含了每个特征的平均重要性得分,sorted_idx
对这些得分进行排序,然后通过plt.barh()
函数绘制水平条形图展示各个特征的重要性排序。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import permutation_importance
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 加载数据
boston = load_boston()
X, y = boston.data, boston.target# 创建随机森林回归模型
model = RandomForestRegressor()# 训练模型
model.fit(X, y)# 计算特征重要性
result = permutation_importance(model, X, y, n_repeats=10, random_state=42)# 可视化特征重要性
sorted_idx = result.importances_mean.argsort()
plt.barh(boston.feature_names[sorted_idx], result.importances_mean[sorted_idx])
plt.xlabel("排列重要性")
plt.savefig("../4.png", dpi=500)
plt.show()
实例运行结果如下图所示: 在生成的图中,我们可以看到各个特征的Permutation Importance值,即通过对每个特征进行随机排列后观察模型性能的变化,得出的重要性分数。条形图中的特征名称表示了对应的特征,条形的长度表示了特征的重要性得分,长度越长表示该特征对于模型的预测结果影响越大。
通过观察图中的条形图,我们可以清晰地看到哪些特征对模型的预测有着较大的贡献,进而可以根据重要性排名来筛选最重要的特征进行模型训练或特征选择。这种可视化方式能够帮助我们了解模型中各个特征对预测结果的相对重要性,从而指导我们在特征选择和模型优化过程中做出更合理的决策。
06-Sklearn实现带有可视化API的ROC曲线
Sklearn提供了方便的API来生成带有可视化的ROC曲线,这有助于评估分类模型的性能,特别是在处理不平衡数据时非常有用。下面将以经典的二分类问题为例进行详细解释和演示。
ROC曲线方法流程:
数据准备:首先,我们加载一个经典的二分类数据集,比如手写数字识别数据集,其中包含了像素值作为特征和对应的标签(0或1)。
选择模型:在这个例子中,我们选择了逻辑回归(Logistic Regression)分类器作为模型。
训练模型:使用手写数字识别数据集训练逻辑回归分类器。
生成ROC曲线:通过Sklearn的roc_curve
函数计算ROC曲线的真阳性率(TPR)和假阳性率(FPR),并通过roc_auc_score
计算AUC值(曲线下面积)来评估模型性能。
可视化:最后,我们通过绘制ROC曲线图表展示模型的性能,以便更直观地了解模型在不同阈值下的整体表现。
具体代码如下:在这个例子中,我们通过生成二分类数据集,并使用逻辑回归分类器构建了一个二分类模型。通过计算ROC曲线的真阳性率(TPR)和假阳性率(FPR),以及AUC值来评估模型性能。最后,通过绘制ROC曲线图表展示了模型的整体性能。
下面是对代码的详细解释:
导入必要的库:首先,导入了需要使用的Python库,包括NumPy用于数值计算,Matplotlib用于可视化,以及Scikit-learn中的相关模块用于生成数据集、构建模型和评估性能。
生成二分类数据集:使用make_classification
函数生成了一个具有1000个样本和20个特征的二分类数据集。这个函数是用于生成随机的二分类数据集,可以通过参数设置来控制数据集的各种属性,如样本数量、特征数量等。
划分训练集和测试集:使用train_test_split
函数将生成的数据集划分为训练集和测试集,其中测试集占总样本的30%。这一步是为了在模型训练和评估时能够独立地验证模型的性能。
创建逻辑回归分类器:使用LogisticRegression
类创建了一个逻辑回归分类器的实例。逻辑回归是一种用于解决二分类问题的线性模型,常用于预测概率值。
训练模型:使用训练集数据对逻辑回归分类器进行训练,通过调用fit
方法实现。模型将学习如何根据输入的特征对样本进行分类。
预测概率:使用训练好的模型对测试集数据进行预测,并获取预测结果的概率值。这里使用predict_proba
方法获取模型对每个样本属于正类的概率。
计算ROC曲线的真阳性率、假阳性率和AUC值:通过调用roc_curve
函数计算ROC曲线的真阳性率(TPR)、假阳性率(FPR)以及阈值,并使用roc_auc_score
函数计算ROC曲线下的面积(AUC)来评估模型性能。
可视化ROC曲线:最后,使用Matplotlib库绘制了ROC曲线图表。ROC曲线的横轴是FPR,纵轴是TPR,图中橙色曲线表示模型的ROC曲线,曲线下的面积(AUC)给出了模型性能的一个综合评价。虚线表示随机分类的ROC曲线,理想情况下,模型的ROC曲线应该尽量向左上方偏移,与随机分类的曲线相比越远越好。图例中显示了AUC值,提供了一个简洁的性能指标。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, roc_auc_score
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 生成二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建逻辑回归分类器
model = LogisticRegression()# 训练模型
model.fit(X_train, y_train)# 预测概率
y_pred_prob = model.predict_proba(X_test)[:, 1]# 计算ROC曲线的真阳性率、假阳性率和AUC值
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
auc = roc_auc_score(y_test, y_pred_prob)# 可视化ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='orange', label='ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.xlabel('误报率')
plt.ylabel('真阳性率')
plt.title('受试者工作特征(ROC)曲线')
plt.legend(loc="lower right")
plt.savefig("../5.png", dpi=500)
plt.show()
实例运行结果如下图所示: 在生成的图中,我们可以看到各个特征的Permutation Importance值,即通过对每个特征进行随机排列后观察模型性能的变化,得出的重要性分数。条形图中的特征名称表示了对应的特征,条形的长度表示了特征的重要性得分,长度越长表示该特征对于模型的预测结果影响越大。
07-Sklearn实现数据集转换
Sklearn中的数据集转换通常涉及数据预处理、特征工程和数据标准化等操作,这有助于提高模型的性能和准确性。常见的数据集转换方法包括标准化、归一化、编码分类变量等。下面以数据标准化为例进行详细解释,并提供一个经典的例子进行分析和可视化。
数据标准化方法流程:
数据准备:加载一个经典的数据集,比如鸢尾花数据集(Iris Dataset),该数据集包含了花的特征(如花萼长度、花萼宽度等)和对应的类别标签(鸢尾花的种类)。
选择模型:在这个例子中,我们选择支持向量机分类器(Support Vector Machine, SVM)作为模型。
数据标准化:使用Sklearn提供的数据标准化方法,如StandardScaler
进行数据标准化处理。数据标准化可以将特征数据缩放到均值为0,方差为1的范围,以避免特征之间的差异对模型的影响。
训练模型:使用数据标准化后的特征数据训练支持向量机分类器。
评估模型:通过交叉验证等方法对模型性能进行评估,并可视化不同参数设置下的结果。
具体代码如下:代码主要是一个完整的数据预处理和模型训练的流程,具体步骤如下:
a、数据准备:加载了鸢尾花数据集,该数据集包含了花的特征和对应的类别标签。
b、训练集和测试集划分:将加载的数据集划分为训练集和测试集,其中测试集占总样本的30%。
c、数据标准化:使用StandardScaler
对特征数据进行标准化处理,保证了特征的均值为0,方差为1。
d、模型选择和训练:选择了支持向量机分类器(SVM)作为模型,并使用标准化后的训练数据对其进行训练。
e、模型评估:使用测试集数据对训练好的模型进行评估,计算并输出了模型在测试集上的准确率。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 创建支持向量机分类器
model = SVC()# 训练模型
model.fit(X_train_scaled, y_train)# 预测
y_pred = model.predict(X_test_scaled)# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
# 可视化标准化前后的特征分布
plt.figure(figsize=(12, 6))# 标准化前的特征分布
plt.subplot(1, 2, 1)
plt.hist(X_train[:, 0], bins=20, color='blue', alpha=0.5, label='Feature 1')
plt.hist(X_train[:, 1], bins=20, color='red', alpha=0.5, label='Feature 2')
plt.xlabel('功能价值')
plt.ylabel('频率')
plt.title('标准化前的特征分布')
plt.legend()# 标准化后的特征分布
plt.subplot(1, 2, 2)
plt.hist(X_train_scaled[:, 0], bins=20, color='blue', alpha=0.5, label='Feature 1')
plt.hist(X_train_scaled[:, 1], bins=20, color='red', alpha=0.5, label='Feature 2')
plt.xlabel('功能价值(标准化)')
plt.ylabel('频率')
plt.title('标准化后的特征分布')
plt.legend()plt.tight_layout()
plt.savefig("../6.png", dpi=500)
plt.show()
实例运行结果如下图所示: 生成的图像进行分析:
标准化前的特征分布(左图):在标准化之前,特征的分布情况展示了原始数据的特点。每个特征的取值范围和尺度可能不同,因此特征之间的分布情况差异较大。
标准化后的特征分布(右图):经过标准化处理后,特征的分布情况呈现出均值为0,方差为1的正态分布。可以看到,经过标准化后,特征的尺度统一,各特征之间的差异性变小,有利于模型的训练和收敛。
总结
综合上述分析:虽然仅仅列出了Scikit-Learn的部分功能,足可以证明它是一个功能强大、易于上手的机器学习工具包,适用于各种使用场景。对于机器学习初学者来说,通过深入了解Scikit-Learn的各种功能和用法,将能够更好地利用这个工具包,提升机器学习模型的效果和性能。对于机器学习的能力的提升至关重要。