一、机器学习与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 support0 1.00 1.00 1.00 11 1.00 1.00 1.00 1accuracy 1.00 2macro avg 1.00 1.00 1.00 2weighted 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的官方文档,并根据具体问题选择合适的算法和参数。机器学习是一个实践性很强的领域,多动手尝试不同的方法和参数组合,才能更好地掌握这些工具。