一、机器学习与sklearn简介
机器学习是人工智能的一个分支,它通过算法让计算机从数据中学习规律,并基于这些规律做出预测或决策。scikit-learn(简称sklearn)是Python中最流行的机器学习库之一,它提供了各种监督学习和无监督学习的算法实现。
sklearn的主要特点:
简单高效的数据挖掘和数据分析工具
基于NumPy、SciPy和matplotlib构建
开源且商业可用 - BSD许可证
丰富的算法支持:分类、回归、聚类、降维等
完善的文档和丰富的社区资源
二、sklearn基础API结构
sklearn的API设计非常一致,主要包含以下几个核心接口:
估计器(Estimator): 用于拟合模型的任何对象,如分类器、回归器等
转换器(Transformer): 用于数据预处理和特征工程的估计器
预测器(Predictor): 能够进行预测的估计器
模型评估: 用于评估模型性能的工具
三、数据预处理API详解
1. 标准化 (StandardScaler)
from sklearn.preprocessing import StandardScaler
"""
StandardScaler参数说明:
- copy : boolean, default=True
是否创建数据的副本,如果为False,则在原始数据上执行标准化
- with_mean : boolean, default=True
是否将数据居中(减去均值)
- with_std : boolean, default=True
是否将数据缩放到单位方差
"""
# 示例代码
scaler = StandardScaler(copy=True, with_mean=True, with_std=True)
data = [[0, 0], [0, 0], [1, 1], [1, 1]]
scaler.fit(data) # 计算均值和标准差
print(scaler.mean_) # 输出均值 [0.5 0.5]
print(scaler.scale_) # 输出标准差 [0.5 0.5]
transformed_data = scaler.transform(data)
print(transformed_data)
"""
输出标准化后的数据:
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
"""
2. 归一化 (MinMaxScaler)
from sklearn.preprocessing import MinMaxScaler
"""
MinMaxScaler参数说明:
- feature_range : tuple (min, max), default=(0, 1)
期望的转换后数据范围
- copy : boolean, default=True
是否创建数据的副本
"""
scaler = MinMaxScaler(feature_range=(0, 1))
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler.fit(data)
print(scaler.data_min_) # 输出最小值 [-1. 2.]
print(scaler.data_max_) # 输出最大值 [ 1. 18.]
transformed_data = scaler.transform(data)
print(transformed_data)
"""
输出归一化后的数据:
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
"""
四、监督学习API详解
1. 线性回归 (LinearRegression)
from sklearn.linear_model import LinearRegression
"""
LinearRegression参数说明:
- fit_intercept : boolean, default=True
是否计算此模型的截距
- normalize : boolean, default=False
是否在回归前对回归变量X进行归一化
- copy_X : boolean, default=True
是否复制X,否则可能会被覆盖
- n_jobs : int, default=None
用于计算的作业数
"""
# 示例代码
X = [[1, 1], [1, 2], [2, 2], [2, 3]] # 特征
y = [1, 2, 2, 3] # 目标值
model = LinearRegression(fit_intercept=True, normalize=False)
model.fit(X, y) # 拟合模型
print(f"系数: {model.coef_}") # 输出: [0.4 0.6]
print(f"截距: {model.intercept_}") # 输出: 0.2
print(f"R²分数: {model.score(X, y)}") # 输出: 0.8
# 预测新数据
print(model.predict([[3, 5]])) # 输出: [4.4]
2. 支持向量机分类 (SVC)
from sklearn.svm import SVC
"""
SVC参数说明:
- C : float, default=1.0
正则化参数,强度与C成反比
- kernel : {'linear', 'poly', 'rbf', 'sigmoid'}, default='rbf'
指定算法中使用的内核类型
- degree : int, default=3
多项式核函数的次数('poly'时使用)
- gamma : {'scale', 'auto'} or float, default='scale'
核系数
- probability : bool, default=False
是否启用概率估计
"""
# 示例代码
X = [[0, 0], [1, 1], [1, 0], [0, 1]] # 特征
y = [0, 1, 1, 0] # 类别标签
model = SVC(C=1.0, kernel='rbf', gamma='scale', probability=False)
model.fit(X, y) # 训练模型
print("支持向量索引:", model.support_) # 输出支持向量的索引
print("支持向量:", model.support_vectors_) # 输出支持向量
print("各类的支持向量数量:", model.n_support_) # 输出每类的支持向量数量
# 预测新数据
print(model.predict([[0.5, 0.5]])) # 输出: [1]
五、模型评估API详解
1. 交叉验证 (cross_val_score)
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
"""
cross_val_score参数说明:
- estimator : 估计器对象
实现"fit"和"score"方法的对象
- X : 数组
要拟合的数据
- y : 数组
目标变量
- cv : int, 交叉验证生成器或可迭代对象, default=None
确定交叉验证拆分策略
- scoring : str或可调用对象, default=None
评分策略
- n_jobs : int, default=None
并行运行的作业数
"""
# 示例代码
X = [[0, 0], [1, 1], [2, 2], [3, 3]] # 特征
y = [0, 1, 0, 1] # 类别标签
model = RandomForestClassifier(n_estimators=10)
scores = cross_val_score(model, X, y, cv=2, scoring='accuracy')
print(f"交叉验证分数: {scores}") # 输出类似: [1. 0.5]
print(f"平均分数: {scores.mean():.2f}") # 输出类似: 0.75
2. 分类报告 (classification_report)
from sklearn.metrics import classification_report
from sklearn.svm import SVC
# 示例代码
X_train = [[0, 0], [1, 1], [2, 2], [3, 3]]
y_train = [0, 1, 0, 1]
X_test = [[0.5, 0.5], [2.5, 2.5]]
y_test = [0, 1]
model = SVC().fit(X_train, y_train)
y_pred = model.predict(X_test)
report = classification_report(y_test, y_pred)
print(report)
"""
输出:
precision recall f1-score support
0 1.00 1.00 1.00 1
1 1.00 1.00 1.00 1
accuracy 1.00 2
macro avg 1.00 1.00 1.00 2
weighted avg 1.00 1.00 1.00 2
"""
六、无监督学习API详解
1. K-Means聚类
from sklearn.cluster import KMeans
"""
KMeans参数说明:
- n_clusters : int, default=8
要形成的簇数
- init : {'k-means++', 'random'}, default='k-means++'
初始化方法
- n_init : int, default=10
使用不同质心种子运行算法的次数
- max_iter : int, default=300
单次运行的最大迭代次数
- tol : float, default=1e-4
收敛阈值
"""
# 示例代码
X = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]
model = KMeans(n_clusters=2, init='k-means++', n_init=10)
model.fit(X)
print("簇中心:", model.cluster_centers_)
print("预测标签:", model.labels_)
print("预测新数据:", model.predict([[0, 0], [4, 4]]))
"""
输出示例:
簇中心: [[1. 2.] [4. 2.]]
预测标签: [0 0 0 1 1 1]
预测新数据: [0 1]
"""
2. 主成分分析 (PCA)
from sklearn.decomposition import PCA
"""
PCA参数说明:
- n_components : int, float or 'mle', default=None
保留的主成分数量
- copy : bool, default=True
是否在运行算法时保留原始数据
- whiten : bool, default=False
是否白化数据
- svd_solver : {'auto', 'full', 'arpack', 'randomized'}, default='auto'
使用的SVD求解器
"""
# 示例代码
X = [[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]
pca = PCA(n_components=1)
pca.fit(X)
print("解释方差比例:", pca.explained_variance_ratio_) # 输出: [0.9924...]
print("主成分:", pca.components_) # 输出: [[-0.838 -0.545]]
X_transformed = pca.transform(X)
print("降维后的数据:", X_transformed)
"""
输出示例:
降维后的数据: [[ 1.383]
[ 2.222]
[ 3.605]
[-1.383]
[-2.222]
[-3.605]]
"""
七、模型选择与参数调优
1. 网格搜索 (GridSearchCV)
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
"""
GridSearchCV参数说明:
- estimator : 估计器对象
实现"fit"和"score"方法的对象
- param_grid : dict或列表
参数名到参数值列表的映射
- cv : int, 交叉验证生成器或可迭代对象, default=None
确定交叉验证拆分策略
- scoring : str或可调用对象, default=None
评分策略
- n_jobs : int, default=None
并行运行的作业数
"""
# 示例代码
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = SVC()
clf = GridSearchCV(svc, parameters, cv=5)
clf.fit([[0, 0], [1, 1], [2, 2], [3, 3]], [0, 1, 0, 1])
print("最佳参数:", clf.best_params_)
print("最佳分数:", clf.best_score_)
print("最佳估计器:", clf.best_estimator_)
"""
输出示例:
最佳参数: {'C': 1, 'kernel': 'linear'}
最佳分数: 0.75
最佳估计器: SVC(C=1, kernel='linear')
"""
八、sklearn使用最佳实践
数据预处理:始终对数据进行适当的缩放和归一化
训练测试分割:在训练前分割数据,避免数据泄露
交叉验证:使用交叉验证评估模型性能
参数调优:使用网格搜索或随机搜索优化超参数
模型持久化:使用joblib保存训练好的模型
特征工程:尝试不同的特征提取和选择方法
集成方法:考虑使用集成方法提高模型性能
# 示例:完整机器学习流程
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from joblib import dump
# 加载数据
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
)
# 数据预处理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 训练模型
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)
# 评估模型
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred))
# 保存模型
dump(model, 'iris_classifier.joblib')
九、总结
scikit-learn提供了强大而一致的API接口,使得机器学习模型的实现变得简单高效。通过本文的详细讲解和代码示例,你应该已经掌握了:
sklearn的基本结构和设计理念
数据预处理的关键API及其参数
监督学习和无监督学习的主要算法实现
模型评估和参数调优的方法
完整的机器学习流程实现
在实际应用中,建议多参考sklearn的官方文档,并根据具体问题选择合适的算法和参数。机器学习是一个实践性很强的领域,多动手尝试不同的方法和参数组合,才能更好地掌握这些工具。