前言
Scikit-learn 是 Python 中最流行的机器学习库之一,它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者,都可以借助它进行快速原型设计和模型开发。
在本教程中,我们将深入讲解 Scikit-learn 的基础操作、数据预处理、模型构建与调优、以及常用的机器学习算法,包括线性回归、决策树、支持向量机、聚类等。通过这份详细教程,你将掌握如何使用 Scikit-learn 构建高效的机器学习模型。
目录
前言
目录
1. Scikit-learn 基础
安装 Scikit-learn
Scikit-learn API 概述
数据集导入与基本操作
2. 数据预处理
数据标准化与归一化
处理缺失数据
类别特征编码
数据拆分与交叉验证
3. 监督学习
线性回归
逻辑回归
支持向量机(SVM)
决策树与随机森林
4. 无监督学习
K-means 聚类
主成分分析(PCA)
DBSCAN 聚类
5. 模型评估与调优
模型评估指标
交叉验证
网格搜索与随机搜索
6. 高级功能
管道(Pipeline)机制
自定义评分函数与模型
示例:使用 Scikit-learn 进行鸢尾花分类
步骤 1:加载数据集
步骤 2:数据预处理
步骤 4:评估模型
步骤 5:交叉验证与网格搜索调优
步骤 6:使用最佳模型进行预测
结论
1. Scikit-learn 基础
安装 Scikit-learn
使用 pip 安装 Scikit-learn:
pip install scikit-learn
Scikit-learn 依赖于 NumPy、SciPy 和 matplotlib,确保这些库已经安装。
Scikit-learn API 概述
Scikit-learn 的核心是统一的 API 设计,包括三个主要步骤:
- 模型初始化:实例化模型。
- 模型拟合:使用
.fit()
方法训练模型。 - 预测与评估:通过
.predict()
进行预测,使用评估函数进行性能评估。
from sklearn.linear_model import LinearRegression
# 初始化模型
model = LinearRegression()
# 拟合模型
model.fit(X_train, y_train)
# 进行预测
predictions = model.predict(X_test)
数据集导入与基本操作
Scikit-learn 提供了一些内置的数据集,如 Iris
、Boston Housing
和 Digits
,你可以轻松导入并使用这些数据集。
- 加载内置数据集:
from sklearn import datasets
# 加载 Iris 数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target
还可以通过 Pandas 读取 CSV 文件等外部数据集:
import pandas as pd
# 从 CSV 文件读取数据
df = pd.read_csv('data.csv')
X = df.drop(columns=['target'])
y = df['target']
2. 数据预处理
在机器学习中,数据预处理是至关重要的步骤。Scikit-learn 提供了多种工具来处理缺失值、标准化数据和编码类别特征。
数据标准化与归一化
机器学习模型通常要求输入数据进行标准化或归一化,以确保所有特征具有相同的尺度。
- 标准化:通过移除平均值并缩放到单位方差。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
- 归一化:将特征值缩放到 [0, 1] 范围。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)
处理缺失数据
你可以使用 SimpleImputer 处理数据中的缺失值。
from sklearn.impute import SimpleImputer
# 用均值填充缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
类别特征编码
对于类别型特征,OneHotEncoder 和 LabelEncoder 是常用的工具。
- OneHotEncoder:将类别特征编码为多个二进制列。
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse=False)
X_encoded = encoder.fit_transform(X)
数据拆分与交叉验证
在训练模型前,你需要将数据集拆分为训练集和测试集,以便评估模型的泛化能力。
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)
3. 监督学习
线性回归
线性回归 是最基础的回归算法之一,用于预测连续值。
from sklearn.linear_model import LinearRegression
# 创建线性回归模型
model = LinearRegression()
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
逻辑回归
逻辑回归 用于二分类或多分类任务。
from sklearn.linear_model import LogisticRegression
# 创建逻辑回归模型
model = LogisticRegression()
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
支持向量机(SVM)
支持向量机可以用于分类、回归和异常检测任务。
from sklearn.svm import SVC
# 创建支持向量机模型
model = SVC(kernel='linear')
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
决策树与随机森林
决策树 是一种简单但强大的模型,随机森林 是基于多个决策树的集成模型。
- 决策树:
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
- 随机森林:
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
4. 无监督学习
K-means 聚类
K-means 是一种常见的聚类算法,用于将数据划分为 K 个簇。
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
model.fit(X)
labels = model.predict(X)
主成分分析(PCA)
主成分分析 是一种降维技术,用于减少数据的特征维度,同时保留数据的主要信息。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
DBSCAN 聚类
DBSCAN 是一种基于密度的聚类算法,能够处理噪声和形状不规则的簇。
from sklearn.cluster import DBSCAN
model = DBSCAN(eps=0.5, min_samples=5)
labels = model.fit_predict(X)
5. 模型评估与调优
模型评估指标
- 分类任务常用指标:准确率、精确率、召回率、F1 分数。
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 准确率
accuracy = accuracy_score(y_test, y_pred)
# 精确率、召回率、F1 分数
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
- 回归任务常用指标:均方误差、平均绝对误差、R² 分数。
from sklearn.metrics import mean_squared_error, r2_score
# 均方误差和 R² 分数
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
交叉验证
交叉验证可以帮助你评估模型在不同数据划分下的性能。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)
print("Cross-validation scores:", scores)
网格搜索与随机搜索
通过 GridSearchCV 和 RandomizedSearchCV 可以自动化地进行超参数调优。
- 网格搜索:
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
model = SVC()
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("最佳参数:", grid_search.best_params_)
print("最佳得分:", grid_search.best_score_)
在上述示例中,GridSearchCV
会尝试不同的参数组合,通过交叉验证选择性能最好的模型。
- 随机搜索:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
param_dist = {'C': uniform(0.1, 10), 'kernel': ['linear', 'rbf']}
model = SVC()
random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5, random_state=42)
random_search.fit(X_train, y_train)
print("最佳参数:", random_search.best_params_)
print("最佳得分:", random_search.best_score_)
RandomizedSearchCV
在参数空间较大时效率更高,因为它只随机采样参数组合。
6. 高级功能
管道(Pipeline)机制
Pipeline 机制允许将数据预处理和模型训练步骤串联起来,简化工作流程并避免数据泄漏。
- 创建管道:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipeline = Pipeline([
('scaler', StandardScaler()),
('svc', SVC())
])
pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
- 在管道中进行参数调优:
from sklearn.model_selection import GridSearchCV
param_grid = {
'svc__C': [0.1, 1, 10],
'svc__kernel': ['linear', 'rbf']
}
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("最佳参数:", grid_search.best_params_)
在参数网格中,使用 步骤名称__参数名
的形式指定参数。
自定义评分函数与模型
- 自定义评分函数:
你可以定义自己的评分函数,用于模型评估和选择。
from sklearn.metrics import make_scorer, fbeta_score
# 定义自定义评分函数
fbeta_scorer = make_scorer(fbeta_score, beta=0.5)
# 在 GridSearchCV 中使用自定义评分函数
grid_search = GridSearchCV(model, param_grid, scoring=fbeta_scorer, cv=5)
- 自定义模型:
如果 Scikit-learn 没有满足你需求的模型,你可以创建自定义模型,只要遵循 fit
和 predict
方法的接口。
from sklearn.base import BaseEstimator, ClassifierMixin
class MyCustomModel(BaseEstimator, ClassifierMixin):
def __init__(self, param=1):
self.param = param
def fit(self, X, y):
# 自定义训练逻辑
return self
def predict(self, X):
# 自定义预测逻辑
return predictions
示例:使用 Scikit-learn 进行鸢尾花分类
我们将使用 Scikit-learn 的 Iris 数据集 进行分类任务。鸢尾花数据集包含 150 个样本,有 4 个特征和 3 个类别,目标是根据花瓣和萼片的大小来预测花的类别。
步骤 1:加载数据集
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 加载 Iris 数据集
iris = datasets.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)
步骤 2:数据预处理
我们将对特征进行标准化处理,使每个特征的均值为 0,方差为 1。
from sklearn.preprocessing import StandardScaler
# 标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
步骤 3:训练分类模型(逻辑回归)
from sklearn.linear_model import LogisticRegression
# 创建逻辑回归模型
model = LogisticRegression()
# 训练模型
model.fit(X_train, y_train)
步骤 4:评估模型
我们使用准确率(Accuracy)评估模型在测试集上的性能。
from sklearn.metrics import accuracy_score
# 预测测试集
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")
步骤 5:交叉验证与网格搜索调优
使用交叉验证评估模型,并使用 GridSearchCV 进行超参数调优。
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'C': [0.1, 1, 10],
'solver': ['lbfgs', 'liblinear']
}
# 使用 GridSearchCV 进行超参数调优
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数和最佳分数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")
步骤 6:使用最佳模型进行预测
使用调优后的最佳模型对测试集进行预测,并计算新的准确率。
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
# 计算准确率
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")
完整代码总结
from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加载数据集
iris = datasets.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)
# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建并训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率: {accuracy:.2f}")
# 交叉验证与调优
param_grid = {'C': [0.1, 1, 10], 'solver': ['lbfgs', 'liblinear']}
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.2f}")
# 使用最佳模型进行预测
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"使用最佳模型的测试集准确率: {accuracy_best:.2f}")
结论
通过本教程,你已经全面了解了 Scikit-learn 的基本使用方法和高级功能。从数据预处理、模型构建、模型评估到模型调优,Scikit-learn 提供了一套完整的机器学习解决方案。它的统一 API 设计使得各个算法之间的切换和比较变得非常容易。无论你是机器学习的新手还是经验丰富的开发者,Scikit-learn 都是一个不可或缺的工具,帮助你高效地构建和部署机器学习模型。