Sklearn 教程
我将为你提供一个简洁的 Scikit-learn(sklearn)教程,涵盖其核心功能和基本使用方法。Scikit-learn 是一个强大的 Python 机器学习库,广泛用于数据分析和建模。以下教程将包括安装、数据预处理、模型训练、评估和调优的示例,适合初学者和有一定经验的用户。
1. 安装 Scikit-learn
确保你已安装 Python(建议版本 3.6+)。使用 pip 安装 Scikit-learn:
pip install scikit-learn
验证安装:
import sklearn
print(sklearn.__version__) # 查看版本号
依赖库(如 NumPy、SciPy)会自动安装。
2. Scikit-learn 核心概念
- 数据集:Scikit-learn 使用 NumPy 数组或 Pandas DataFrame 存储数据。通常,
X
表示特征矩阵,y
表示目标变量。 - 估算器(Estimator):所有模型(如回归、分类、聚类)都遵循估算器接口,包含
fit()
、predict()
等方法。 - 管道(Pipeline):用于组合数据预处理和模型训练步骤。
- 交叉验证:用于评估模型性能,防止过拟合。
- 超参数调优:通过 GridSearchCV 或 RandomizedSearchCV 优化模型参数。
3. 基本工作流程
以下是一个完整的示例,使用 Scikit-learn 进行分类任务(基于经典的鸢尾花数据集)。
步骤 1:加载数据
Scikit-learn 提供了一些内置数据集,例如鸢尾花数据集:
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target # X 是特征矩阵,y 是类别标签
print(X.shape) # (150, 4) 表示 150 个样本,4 个特征
print(y.shape) # (150,) 表示 150 个标签
步骤 2:数据预处理
数据预处理是机器学习的重要步骤。常见操作包括:
- 标准化(Standardization):将特征缩放到均值为 0、方差为 1。
- 归一化(Normalization):将特征缩放到 [0, 1] 范围。
- 处理缺失值:用均值、中位数等填充缺失值。
示例 – 标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 标准化特征
步骤 3:拆分数据集
将数据分为训练集和测试集以评估模型性能:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape) # (120, 4), (30, 4)
步骤 4:选择和训练模型
使用逻辑回归(Logistic Regression)作为示例分类器:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train) # 训练模型
步骤 5:预测和评估
对测试集进行预测并评估模型性能:
from sklearn.metrics import accuracy_score, classification_report
y_pred = model.predict(X_test) # 预测
accuracy = accuracy_score(y_test, y_pred) # 计算准确率
print(f"Accuracy: {accuracy:.2f}")
print("Classification Report:\n", classification_report(y_test, y_pred, target_names=iris.target_names))
输出示例:
Accuracy: 1.00
Classification Report:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
步骤 6:超参数调优
使用 GridSearchCV 优化模型参数:
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10], 'penalty': ['l2']}
grid_search = GridSearchCV(LogisticRegression(random_state=42), param_grid, cv=5)
grid_search.fit(X_train, y_train)
print("Best Parameters:", grid_search.best_params_)
print("Best Score:", grid_search.best_score_)
4. 其他常用模型
Scikit-learn 支持多种机器学习算法,以下是几个常用模型的简单示例:
决策树(Decision Tree)
from sklearn.tree import DecisionTreeClassifier
dt_model = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_model.fit(X_train, y_train)
y_pred_dt = dt_model.predict(X_test)
print(f"Decision Tree Accuracy: {accuracy_score(y_test, y_pred_dt):.2f}")
随机森林(Random Forest)
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
print(f"Random Forest Accuracy: {accuracy_score(y_test, y_pred_rf):.2f}")
支持向量机(SVM)
from sklearn.svm import SVC
svm_model = SVC(kernel='rbf', random_state=42)
svm_model.fit(X_train, y_train)
y_pred_svm = svm_model.predict(X_test)
print(f"SVM Accuracy: {accuracy_score(y_test, y_pred_svm):.2f}")
K 均值聚类(K-Means Clustering)
用于无监督学习:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_scaled)
clusters = kmeans.labels_
print("Cluster Labels:", clusters[:10])
5. 使用 Pipeline 简化流程
Pipeline 可以将预处理和模型训练组合在一起,避免数据泄漏:
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()), # 标准化
('classifier', LogisticRegression(random_state=42)) # 模型
])
pipeline.fit(X_train, y_train)
y_pred_pipeline = pipeline.predict(X_test)
print(f"Pipeline Accuracy: {accuracy_score(y_test, y_pred_pipeline):.2f}")
6. 保存和加载模型
使用 joblib
保存训练好的模型:
import joblib
joblib.dump(model, 'logistic_model.pkl') # 保存模型
loaded_model = joblib.load('logistic_model.pkl') # 加载模型
y_pred_loaded = loaded_model.predict(X_test)
print(f"Loaded Model Accuracy: {accuracy_score(y_test, y_pred_loaded):.2f}")
7. 高级功能
- 特征选择:使用
SelectKBest
或RFE
选择重要特征。
from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(score_func=f_classif, k=2)
X_selected = selector.fit_transform(X, y)
print(X_selected.shape) # (150, 2)
- 交叉验证:使用
cross_val_score
评估模型稳定性。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_scaled, y, cv=5)
print(f"Cross-Validation Scores: {scores.mean():.2f} ± {scores.std():.2f}")
- 降维:使用 PCA 进行主成分分析。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(X_pca.shape) # (150, 2)
8. 实用资源
- 官方文档:https://scikit-learn.org/stable/
- 示例代码:https://scikit-learn.org/stable/auto_examples/index.html
- 数据集:Scikit-learn 内置数据集(如
load_breast_cancer
、load_digits
)或外部数据集(如 Kaggle)。 - 社区:Stack Overflow、X 平台上搜索
#scikit-learn
获取最新讨论。
9. 注意事项
- 数据清洗:确保数据无缺失值、无异常值。
- 特征工程:特征选择和构造对模型性能影响很大。
- 过拟合:通过正则化、交叉验证或减少模型复杂度防止过拟合。
- 计算效率:对于大数据集,考虑使用
MiniBatchKMeans
或SGDClassifier
等高效算法。
这个教程涵盖了 Scikit-learn 的基本使用流程和常见任务。如果你有具体问题(例如某个算法的细节、处理特定数据集、生成可视化图表等),请告诉我,我可以进一步深入讲解或提供代码!