在上一篇基础教程中,我们介绍了 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 提供了多种特征提取和选择的方法,包括 PolynomialFeatures
、SelectKBest
等。
多项式特征
多项式特征是特征工程中常用的方法,可以增加模型的复杂度和非线性性。
代码语言:python代码运行次数:0复制from sklearn.preprocessing import PolynomialFeatures
# 生成多项式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
特征选择
特征选择可以帮助减少模型的复杂度,提高模型的泛化能力。SelectKBest
是一种常用的方法,根据统计检验选择最好的 K 个特征。
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_score
和 GridSearchCV
来帮助进行模型选择和评估。
交叉验证
交叉验证是评估模型的一种稳健方法,可以更好地估计模型在未见数据上的性能。
代码语言: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
可以自动搜索并评估每个参数组合的性能。
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,提高机器学习模型的性能和效果。