Scikit-learn(简称为sklearn)是一个开源的Python机器学习库,提供了丰富而强大的工具,用于数据挖掘和数据分析。它的发展始于2007年,由David Cournapeau在Google Summer of Code项目中启动,后续得到了许多开发者的贡献,包括法国国家信息与自动化研究所(INRIA)、Waikato大学等机构。Scikit-learn的命名来源于其构建基础,即基于SciPy构建而成的机器学习库,Scikit是SciPy Kit的缩写,意为SciPy衍生的工具套件。Scikit-learn是机器学习领域中最完整、最具影响力的算法库之一。它建立在Python科学计算的基础上,依赖于NumPy、SciPy和matplotlib等库,并提供了大量的机器学习算法实现。
一、Scikit-learn官网
Scikit-Learn的官网是学习和使用该机器学习库的绝佳资源。它提供了丰富而全面的内容,涵盖了从安装到算法原理再到实际应用的方方面面。下面是Scikit-Learn官网主要功能的概述:
Scikit-Learn官网地址
安装和更新:官网提供了关于如何安装和更新Scikit-Learn的详细说明。用户可以根据自己的操作系统和Python环境选择合适的安装方式,并按照指南进行操作。同时,也提供了更新库的方法,以确保用户始终使用最新版本的Scikit-Learn。
文档和教程:Scikit-Learn官网的文档和教程是其最重要的部分之一。文档详细介绍了库中各个模块、函数和类的用法,以及参数的含义和用法示例。教程则以实际案例为基础,逐步介绍了如何使用Scikit-Learn解决不同类型的问题,如分类、回归、聚类等。这些文档和教程涵盖了从入门到专业的各个层次,为用户提供了丰富的学习资源。
API参考:Scikit-Learn官网提供了完整的API参考,包括所有可用函数和类的详细说明。用户可以在这里查找特定函数或类的用法和参数,以便更好地理解和使用库中的功能。
示例和案例:官网还提供了大量的示例和案例,展示了Scikit-Learn在各种实际问题中的应用。这些示例涵盖了多种不同的数据集和算法,帮助用户了解如何在实际场景中使用Scikit-Learn解决问题,并提供了启发和参考。
社区支持:Scikit-Learn官网还有一个社区支持的部分,包括用户论坛、邮件列表等。用户可以在这里提出问题、分享经验,与其他用户和开发者交流互动,获得帮助和支持。
贡献指南:对于希望为Scikit-Learn项目贡献代码或文档的开发者,官网提供了贡献指南,包括代码提交流程、文档编辑指南等。这些指南帮助开发者了解如何参与到Scikit-Learn的开发和改进中。
Scikit-Learn官网是学习和使用该机器学习库的绝佳资源。它提供了丰富的文档、教程、示例和社区支持,为用户提供了全面的学习和使用指南。
二、Scikit-learn的快速入门
2.1 数据集的导入和处理
Scikit-learn提供了非常多的内置数据集,并且还提供了一些创建数据集的方法,这些数据集常用于演示各种机器学习算法的使用方法。这些数据集分为两种类型:小规模的玩具数据集(Toy Datasets)和大规模的真实世界数据集(Real-World Datasets)。以下是几个常见的玩具数据集:
Iris(鸢尾花):一个分类问题的数据集,包含了三种鸢尾花的四个特征,目标是根据这些特征预测鸢尾花的种类。
Digits(手写数字):一个多分类问题的数据集,包含了手写数字的8x8像素图像,目标是识别这些图像对应的数字。
Boston House Prices(波士顿房价):这是一个回归问题的数据集,包含了波士顿各个区域的房价和其他13个特征,目标是预测房价。
Breast Cancer(乳腺癌):这是一个二分类问题的数据集,包含了乳腺肿瘤的30个特征,目标是预测肿瘤是良性还是恶性。
sklearn中的数据集相关功能都在datasets模块下,可以通过API文档中的datasets模块所包含的内容对所有的数据集和创建数据集的方法进行概览。
from sklearn.datasets import load_iris, load_digits, load_boston, load_breast_cancer
# 加载Iris(鸢尾花)数据集
iris = load_iris()
print("Iris数据集特征:", iris.feature_names)
print("Iris数据集目标分类:", iris.target_names)
print("Iris数据集前5行:\n", iris.data[:5])
print("Iris数据集目标前5行:\n", iris.target[:5])
# 加载Digits(手写数字)数据集
digits = load_digits()
print("\nDigits数据集特征形状:", digits.data.shape)
print("Digits数据集目标形状:", digits.target.shape)
print("Digits数据集前5行:\n", digits.data[:5])
print("Digits数据集目标前5行:\n", digits.target[:5])
# 加载Boston House Prices(波士顿房价)数据集
boston = load_boston()
print("\nBoston House Prices数据集特征:", boston.feature_names)
print("Boston House Prices数据集形状:", boston.data.shape)
print("Boston House Prices数据集前5行:\n", boston.data[:5])
print("Boston House Prices数据集目标前5行:\n", boston.target[:5])
# 加载Breast Cancer(乳腺癌)数据集
cancer = load_breast_cancer()
print("\nBreast Cancer数据集特征:", cancer.feature_names)
print("Breast Cancer数据集目标分类:", cancer.target_names)
print("Breast Cancer数据集形状:", cancer.data.shape)
print("Breast Cancer数据集前5行:\n", cancer.data[:5])
print("Breast Cancer数据集目标前5行:\n", cancer.target[:5])
2.2 数值数据的标准化
Scikit-learn中的预处理模块sklearn.preprocessing提供了许多实用的特征缩放功能,包括数据归一化(Normalization)和标准化(Standardization)。这两种技术都用于改变特征的尺度,以便在训练机器学习模型时保证它们在相同的范围内。从功能上划分,Scikit-learn中的归一化其实是分为标准化(Standardization)和归一化(Normalization)两类。Z-Score标准化和0-1标准化,都属于Standardization的范畴,Normalization则特指针对单个样本(一行数据)利用其范数进行放缩的过程。
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 加载数据集
iris = load_iris()
X = iris.data
# 数据标准化
scaler_standard = StandardScaler()
X_standardized = scaler_standard.fit_transform(X)
# 数据归一化
scaler_minmax = MinMaxScaler()
X_normalized = scaler_minmax.fit_transform(X)
# 打印标准化后的数据
print("标准化后的数据:\n", X_standardized[:5])
# 打印归一化后的数据
print("\n归一化后的数据:\n", X_normalized[:5])
2.3 模型保存
模型保存(model persistence)是一种将训练好的机器学习模型保存到磁盘,然后在以后的时间点(可能是在不同的环境中)加载和使用的技术。这是非常有用的,因为通常训练一个好的模型可能需要大量的时间和计算资源。一旦模型被训练,我们可能希望在未来重新使用它,而不是每次需要时都重新训练。在Scikit-learn中,可以使用Python的内置库pickle,或者joblib库(一种特别针对大数据的pickle)来实现模型保存和加载。
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)
三、使用Scikit-learn实现线性回归建模流程
- Step 1:准备数据,生成1000个基本规律满足 \(y=2x_1-x_2+1\)分布回归类数据集
# 科学计算模块
import numpy as np
import pandas as pd
# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt
# 回归数据创建函数
def arrayGenReg(num_examples = 1000, w = [2, -1, 1], bias = True, delta = 0.01, deg = 1):
"""回归类数据集创建函数。
:param num_examples: 创建数据集的数据量
:param w: 包括截距的(如果存在)特征系数向量
:param bias:是否需要截距
:param delta:扰动项取值
:param deg:方程最高项次数
:return: 生成的特征张和标签张量
"""
if bias == True:
num_inputs = len(w)-1 # 数据集特征个数
features_true = np.random.randn(num_examples, num_inputs) # 原始特征
w_true = np.array(w[:-1]).reshape(-1, 1) # 自变量系数
b_true = np.array(w[-1]) # 截距
labels_true = np.power(features_true, deg).dot(w_true) + b_true # 严格满足人造规律的标签
features = np.concatenate((features_true, np.ones_like(labels_true)), axis=1) # 加上全为1的一列之后的特征
else:
num_inputs = len(w)
features = np.random.randn(num_examples, num_inputs)
w_true = np.array(w).reshape(-1, 1)
labels_true = np.power(features, deg).dot(w_true)
labels = labels_true + np.random.normal(size = labels_true.shape) * delta
return features, labels
这段代码的目的是创建一个回归类数据集。它定义了一个函数arrayGenReg
,用于生成具有特定规律的回归类数据集。该函数根据给定的参数生成特征和标签数据,并可以选择是否添加截距项。特征数据根据正态分布随机生成,而标签数据根据设定的规律进行计算,并添加了服从正态分布的扰动项。这个函数的目的是方便生成用于回归问题的人工数据集。
- Step 2 : 根据函数生成特征和标签数据。
# 设置随机数种子
np.random.seed(24)
# 扰动项取值为0.01
features, labels = arrayGenReg(delta=0.01)
在这一步中,通过使用np.random.seed(24)
设置了随机数种子为24。这样做的目的是确保接下来的随机生成过程可重复,即每次运行代码都会得到相同的随机数序列。然后,调用arrayGenReg
函数生成回归类数据集的特征和标签。在这个例子中,将扰动项的取值设置为0.01,即delta=0.01
。
- Step3 : 绘制两个子图,观察数据集在不同特征维度上的分布情况
# 可视化数据分布
plt.subplot(121)
plt.plot(features[:, 0], labels, 'o')
plt.subplot(122)
plt.plot(features[:, 1], labels, 'o')
分别绘制特征矩阵features
的第一列(features[:, 0]
)、第二列(features[:, 1]
)与标签列labels
之间的关系。
- Step 4:调用Scikit-learn中的线性回归评估器
首先,从Scikit-learn库中导入线性回归评估器,使用LinearRegression
评估器进行线性回归建模。
from sklearn.linear_model import LinearRegression
然后,创建一个线性回归模型对象,被赋值给名为model
的变量。
model = LinearRegression()
接下来,从之前生成的数据集中提取特征矩阵和标签,特征矩阵选取了前两个特征(features[:, :2]
),并将其赋值给X
变量。将标签数组赋值给y
变量。
codeX = features[:, :2] # 特征矩阵,选择前两个特征
y = labels # 标签数组
最后,通过调用评估器中的fit()
方法对模型进行训练:
model.fit(X, y)
通过这些步骤,线性回归模型将被训练并学习数据集中的模式和关联。
在机器学习中,评估器(Estimator)是用于学习数据模式和进行预测的对象。线性回归评估器(LinearRegression)是一种用于拟合线性模型的评估器。
实例化评估器是为了创建一个可供使用的评估器对象。通过实例化,可以设置评估器的参数和属性,以便进行后续的训练和预测操作。在这段代码中,通过使用LinearRegression()
创建了一个线性回归评估器的实例,并将其赋值给model
变量。
fit()
方法是评估器的一个重要方法,用于对模型进行训练。在训练过程中,评估器根据提供的特征矩阵和标签数据,通过最小化损失函数来调整模型的参数,使其能够更好地拟合数据。通过训练过程,模型能够学习特征与标签之间的关系,并建立一个预测模型。
综上所述,通过实例化评估器、提供特征矩阵和标签数据,以及调用fit()
方法来进行模型训练,才能够使用评估器拟合数据,并得到一个能够预测未知样本的线性回归模型。
- Step 5: 查看模型训练参数
print("自变量参数:", model.coef_)
print("模型截距:", model.intercept_)
返回参数如下:
- Step 6: 结果解读
自变量参数:模型学习到的自变量参数为 [[1.99961892, -0.99985281]],接近于基本规律中的 [2, -1]。这表示模型能够很好地学习到数据生成的规律,并对特征之间的关系进行准确建模。
模型截距:模型学习到的截距为 [0.99970541],接近于基本规律中的 1。这意味着即使没有特征输入时,模型预测的输出值仍接近于1。
因此,根据模型的自变量参数和截距结果,可以得出结论:线性回归模型成功地学习到了基本规律中的特征之间的关系,并能够对未知样本进行准确的预测。
- Step 7: 使用MSE做模型评估
可以使用Scikit-learn库中的均方误差(Mean Squared Error,MSE)计算函数,计算了预测值和真实标签之间的均方误差。
# 在metrics模块下导入MSE计算函数
from sklearn.metrics import mean_squared_error
# 输入数据,进行计算
mean_squared_error(model.predict(X), y)
至此就完成了调用Scikit-learn的线性回归模型进行建模的流程。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 回归数据创建函数
def arrayGenReg(num_examples=1000, w=[2, -1, 1], bias=True, delta=0.01, deg=1):
# 生成随机特征
X = np.random.rand(num_examples, len(w))
if bias:
X[:, 0] = 1.0 # 设置偏置项
# 生成标签
y = np.dot(X, np.array(w)) + np.random.normal(0, delta, size=num_examples)
return X, y
# 设置随机数种子
np.random.seed(24)
# 扰动项取值为0.01
features, labels = arrayGenReg(delta=0.01)
# 可视化数据分布
plt.subplot(121)
plt.plot(features[:, 0], labels, 'o')
plt.xlabel('Feature 1')
plt.title('Feature 1 vs Label')
plt.subplot(122)
plt.plot(features[:, 1], labels, 'o')
plt.xlabel('Feature 2')
plt.title('Feature 2 vs Label')
plt.tight_layout()
plt.show()
# 创建线性回归模型
model = LinearRegression()
# 特征矩阵选取前两个特征
X = features[:, :2]
y = labels
# 训练模型
model.fit(X, y)
# 查看模型训练参数
print("自变量参数:", model.coef_)
print("模型截距:", model.intercept_)
# 使用MSE做模型评估
print("模型的MSE:", mean_squared_error(model.predict(X), y))
总结
Scikit-learn是一个功能强大且易于使用的Python机器学习库,提供了丰富的算法实现和工具,帮助用户进行数据挖掘和分析,Scikit-learn是机器学习领域中最受欢迎的Python库之一,它的简洁易用和丰富功能使得用户能够快速上手并进行高效的数据分析和建模工作。其主要特点包括:
全面的算法支持:Scikit-learn包含了大量的机器学习算法实现,涵盖了分类、回归、聚类、降维等各种领域。无论是经典的算法还是最新的研究成果,都能在Scikit-learn中找到对应的实现。
清晰的API设计:Scikit-learn的API设计简洁明了,易于使用和理解。它采用了一致的接口风格,使得用户可以轻松地切换不同的算法和模型,同时也方便进行模型的组合和流水线构建。
丰富的功能模块:Scikit-learn提供了多个功能模块,涵盖了数据预处理、特征提取、模型选择与评估、模型保存与加载等各个方面。用户可以根据需要选择不同的模块进行数据处理和模型训练。
内置数据集和示例:Scikit-learn内置了多个经典数据集,包括Iris(鸢尾花)、Digits(手写数字)、Boston House Prices(波士顿房价)等,用户可以直接使用这些数据集进行实验和练习。同时,它还提供了丰富的示例和案例,帮助用户理解和应用不同的算法。
高效的性能和扩展性:Scikit-learn采用了优化的算法和数据结构,具有良好的性能和可扩展性。它能够处理大规模数据集,并支持并行计算和分布式计算,满足用户在实际问题中的需求。