【Sklearn | 2】sklearn 高级教程

2024-07-17 16:26:36 浏览数 (1)

在上一篇基础教程中,我们介绍了 sklearn 的基础使用方法。本文将进一步深入,介绍一些高级功能和技巧,包括管道、特征工程、模型选择与评估、以及集成方法等。

管道(Pipeline)

在实际项目中,数据预处理和模型训练通常是串联的多个步骤。sklearn 提供了 Pipeline 类来简化这些步骤的管理,使代码更加简洁和模块化。

示例:管道的使用

代码语言:python代码运行次数:0复制
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 创建管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 第一步:标准化
    ('classifier', LogisticRegression())  # 第二步:逻辑回归分类
])

# 拟合管道
pipeline.fit(X_train, y_train)

# 预测
y_pred = pipeline.predict(X_test)

# 评估
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))

通过管道,可以避免在数据预处理和模型训练之间手动传递数据,使整个流程更加紧凑和可读。

特征工程

特征工程是提升模型性能的重要步骤。sklearn 提供了多种特征提取和选择的方法,包括 PolynomialFeaturesSelectKBest 等。

多项式特征

多项式特征是特征工程中常用的方法,可以增加模型的复杂度和非线性性。

代码语言:python代码运行次数:0复制
from sklearn.preprocessing import PolynomialFeatures

# 生成多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

特征选择

特征选择可以帮助减少模型的复杂度,提高模型的泛化能力。SelectKBest 是一种常用的方法,根据统计检验选择最好的 K 个特征。

代码语言:python代码运行次数:0复制
from sklearn.feature_selection import SelectKBest, f_classif

# 选择最好的两个特征
selector = SelectKBest(score_func=f_classif, k=2)
X_new = selector.fit_transform(X, y)

模型选择与交叉验证

模型选择是机器学习中的一个重要环节。sklearn 提供了 cross_val_scoreGridSearchCV 来帮助进行模型选择和评估。

交叉验证

交叉验证是评估模型的一种稳健方法,可以更好地估计模型在未见数据上的性能。

代码语言:python代码运行次数:0复制
from sklearn.model_selection import cross_val_score

# 进行 5 折交叉验证
scores = cross_val_score(LogisticRegression(), X, y, cv=5)
print(f"Cross-validation scores: {scores}")
print(f"Mean cross-validation score: {scores.mean()}")

网格搜索

网格搜索可以帮助找到模型的最佳超参数组合。通过定义参数网格,GridSearchCV 可以自动搜索并评估每个参数组合的性能。

代码语言:python代码运行次数:0复制
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10, 100],
    'solver': ['lbfgs', 'liblinear']
}

# 网格搜索
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 最佳参数
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best cross-validation score: {grid_search.best_score_}")

集成方法

集成方法通过结合多个模型的预测结果,可以显著提高模型的性能和稳定性。sklearn 提供了多种集成方法,如随机森林(RandomForest)、梯度提升(Gradient Boosting)等。

随机森林

随机森林是一种集成方法,通过构建多个决策树并取其平均来提高模型的准确性和稳定性。

代码语言:python代码运行次数:0复制
from sklearn.ensemble import RandomForestClassifier

# 创建随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# 预测
y_pred = rf.predict(X_test)

# 评估
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))

梯度提升

梯度提升是一种逐步优化的集成方法,通过迭代地构建模型来减少预测误差。

代码语言:python代码运行次数:0复制
from sklearn.ensemble import GradientBoostingClassifier

# 创建梯度提升模型
gb = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42)
gb.fit(X_train, y_train)

# 预测
y_pred = gb.predict(X_test)

# 评估
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))

示例项目:高级鸢尾花分类

结合上述高级功能,我们来完成一个更高级的鸢尾花分类项目。

代码语言:python代码运行次数:0复制
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.pipeline import Pipeline
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score, classification_report
import joblib

# 加载数据集
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.2, random_state=42)

# 创建管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 标准化
    ('poly', PolynomialFeatures(degree=2)),  # 多项式特征
    ('selector', SelectKBest(score_func=f_classif, k=2)),  # 特征选择
    ('classifier', GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42))  # 梯度提升分类
])

# 定义参数网格
param_grid = {
    'poly__degree': [1, 2, 3],
    'selector__k': [1, 2, 3],
    'classifier__n_estimators': [50, 100, 150],
    'classifier__learning_rate': [0.01, 0.1, 1]
}

# 网格搜索
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 预测
y_pred = grid_search.predict(X_test)

# 评估
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(classification_report(y_test, y_pred))

# 最佳参数
print(f"Best parameters: {grid_search.best_params_}")

# 模型持久化
joblib.dump(grid_search.best_estimator_, 'advanced_iris_classifier.pkl')

通过这篇高级教程,我们介绍了 sklearn 中更高级的一些功能和技巧,包括管道、特征工程、模型选择与评估、以及集成方法等。希望通过这篇教程,你能在实际项目中更好地应用 sklearn,提高机器学习模型的性能和效果。

0 人点赞