Skip to content
2026-09-29 04:204939 字机器学习scikit-learn代码

基础代码 ​

数据预处理 ​

拆分数据集 ​

python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
	x,	# 特征数据
	y, 	# 标签数据
	test_size=0.2, 		# 测试集的比例
	random_state=22,   	# 随机种子
	stratify=None		# 参考某一列的值
)

特征工程 ​

特征预处理 ​

  • 归一化 ​
    python
    sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1))  # 创建归一化对象
    # feature_range:归一化的范围,默认为(0, 1)
    fit_transform(X)  # 训练并返回结果,X为特征向量
    python
    from sklearn.preprocessing import MinMaxScaler
    x_train = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
    scaler = MinMaxScaler()                         # 创建归一化对象
    x_train_scaled = scaler.fit_transform(x_train)  # 归一化并返回结果
    print('归一化后的结果为:\n', x_train_scaled)
  • 标准化 ​
    python
    sklearn.preprocessing.StandardScaler()
    python
    from sklearn.preprocessing import StandardScaler
    x_train = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
    scaler = StandardScaler()                       # 创建标准化对象
    x_train_scaled = scaler.fit_transform(x_train)  # 标准化并返回结果
    print('标准化后的结果为:\n', x_train_scaled)
    print('均值为:', scaler.mean_)
    print('方差为:', scaler.var_)
    print('标准差为:', scaler.scale_)

实例化模型 ​

监督学习 ​

KNN ​

  • 分类

    python
    sklearn.neighbors.KNeighborsClassifier(n_eighbors=5)  # 创建KNN分类器
    # n_eighbors:最近邻的邻居数,即K值(默认:5)
    # k_eighbors:查询默认使用的邻居数
    python
    from sklearn.neighbors import KNeighborsClassifier
    
    x_train = [[0], [1], [2], [3]]  # 训练集的特征向量,因为特征可以有多个特征,所以是一个二维数组
    y_train = [0, 0, 1, 1]          # 训练集的标签,因为标签是离散的,所以是一个一维数组
    x_test = [[5]]                  # 测试集的特征向量
    
    knn = KNeighborsClassifier(n_neighbors=2)  	# 创建KNN分类器
    knn.fit(x_train, y_train)  		# 训练KNN分类器
    y_pre = knn.predict(x_test)  	# 预测结果 
    print('预测值为:', y_pre)  		# 预测值为: [1]
  • 回归

    python
    sklearn.neighbors.KNeighborsRegressor(n_neighbors=5)  # 创建KNN回归器
    # n_neighbors:最近邻的邻居数,即K值(默认:5)
    # k_neighbors:查询默认使用的邻居数
    python
    from sklearn.neighbors import KNeighborsRegressor
    
    x_train = [[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]]  # 训练集的特征向量
    y_train = [0.1, 0.2, 0.3, 0.4]                              # 训练集的标签
    x_test = [[3, 11, 10]]  # 测试集的特征向量
    
    knn = KNeighborsRegressor(n_neighbors=2)  # 创建KNN回归器
    knn.fit(x_train, y_train)       # 训练KNN回归器
    y_pre = knn.predict(x_test)     # 预测结果
    print('预测值为:', y_pre)  		# 预测值为: [0.35]

线性回归 ​

  • 正规方程 ​
    python
    from sklearn.linear_model import LinearRegression
    model = LinearRegression(
        fit_intercept=True,   # 是否计算偏置(b,截距项),默认 True
        copy_X=True,          # 是否复制输入数据,避免修改原始数据
        n_jobs=None,          # 并行任务数(None 表示不并行,-1 表示使用所有 CPU)
        positive=False        # 是否强制系数为非负(仅适用于单特征,实验性功能)
    )
    
    # 属性
    model.coef_			# 回归系数
    model.intercept_	# 偏置
  • 梯度下降 ​
    python
    from sklearn.linear_model import SGDRegressor	# 随机梯度下降
    model_sgd = SGDRegressor(
        loss='squared_error',     # 损失函数:'squared_error' 对应 MSE(默认)
        penalty='l2',             # 正则化类型:'l2'(岭回归)、'l1'(Lasso)、'elasticnet' 或 None
        alpha=0.0001,             # 正则化强度(越大正则化越强)
        l1_ratio=0.15,            # ElasticNet 中 L1 占比(仅当 penalty='elasticnet' 时有效)
        fit_intercept=True,       # 是否计算偏置(b,截距项),默认 True
        max_iter=1000,            # 最大迭代次数
        tol=1e-3,                 # 收敛容忍度(若 loss 变化 < tol,则提前停止)
        shuffle=True,             # 每轮是否打乱样本顺序
        learning_rate='invscaling',  # 学习率策略:'constant', 'optimal', 'invscaling', 'adaptive'
        eta0=0.01,                # 初始学习率(对 'constant' 和 'invscaling' 有效)
        random_state=None         # 随机种子(确保可复现)
    )
    
    # 属性
    model_sgd.coef			# 回归系数
    model_sgd.intercept_	# 偏置

逻辑回归 ​

python
from sklearn.linear_model import LogisticRegression

# 实例化逻辑回归模型
model = LogisticRegression(
    penalty='l2',              # 正则化类型:'l1'(Lasso)、'l2'(Ridge,默认)、'elasticnet'、None(无正则)
    dual=False,                # 是否使用对偶形式(仅当 penalty='l2' 且 solver='liblinear' 时有效)
    tol=1e-4,                  # 优化算法的收敛容忍度(停止条件)
    C=1.0,                     # 正则化强度的倒数(C 越小,正则越强;默认 1.0)
    fit_intercept=True,        # 是否计算偏置项(即截距 b)
    intercept_scaling=1,       # 仅在 solver='liblinear' 且 fit_intercept=True 时有效,用于缩放偏置
    class_weight=None,         # 类别权重:'balanced' 可自动调整权重以处理不平衡数据
    random_state=None,         # 随机种子(用于 solver='sag', 'saga', 'liblinear' 时保证可复现)
    solver='lbfgs',            # 优化算法:
                               #   - 'liblinear':适用于小数据集,支持 L1/L2
                               #   - 'lbfgs':默认,适用于多分类,仅支持 L2
                               #   - 'newton-cg':支持 L2,适合多分类
                               #   - 'sag' / 'saga':适用于大数据集(随机梯度类),'sag' 仅支持 L2 正则,而 'saga' 支持 L1/L2/ElasticNet
    max_iter=100,              # 最大迭代次数(若未收敛会警告)
    multi_class='auto',        # 多分类策略:
                               #   - 'ovr'(One-vs-Rest):适用于二分类或 liblinear
                               #   - 'multinomial':使用 Softmax 损失,适合多分类
                               #   - 'auto':自动选择(默认,推荐)
    verbose=0,                 # 日志输出级别(0 表示静默)
    warm_start=False,          # 是否使用前一次训练结果作为初始化(用于多次训练)
    n_jobs=None,               # 并行任务数(None 表示不并行,-1 表示使用所有 CPU)
    l1_ratio=None              # ElasticNet 中 L1 正则的比例(仅当 penalty='elasticnet' 时有效)
)

决策树 ​

  • CART 分类树 ​

    【案例】泰坦尼克号乘客生存预测

    python
    from sklearn.tree import DecisionTreeClassifier
    
    clf = DecisionTreeClassifier(
        criterion='gini',            # 划分标准('gini' 或 'entropy')
        max_depth=None,              # 树的最大深度(None 表示不限制)
        min_samples_split=2,         # 节点分裂所需的最小样本数
        min_samples_leaf=1,          # 叶节点所需的最小样本数
        random_state=None            # 随机种子(用于结果复现)
    )
    • ​​criterion​​ 衡量划分质量的标准。

      • ​'gini'​:使用基尼不纯度,计算高效,是默认选项。
      • ​'entropy'​:使用信息增益(基于香农熵),对纯度更敏感,但计算稍慢。
    • ​​max_depth​​ 决策树的最大深度。

      • 若为 None​(默认),树会一直生长直到所有叶子纯净或满足其他停止条件,容易过拟合。
      • 设置较小的整数(如 3~10)可有效控制模型复杂度,提升泛化能力。
    • ​​min_samples_split​​ 一个内部节点要被分裂所需的最小样本数量。

      • 默认值为 2​,即只要有 2 个样本就可能继续分裂。
      • 增大该值可防止模型在小样本区域过度细分,有助于减少过拟合。
    • ​​min_samples_leaf​​ 每个叶节点必须包含的最小样本数量。

      • 默认值为 1​,允许叶子只含一个样本。
      • 增大该值(如设为 5 或 10)可使叶子更具代表性,平滑模型预测,提升鲁棒性。
    • ​​random_state​​ 控制随机性的种子。

      • 若为 None​(默认),每次训练结果可能不同。
      • 设为整数(如 42​)可确保每次运行代码时得到完全相同的树结构,便于调试和复现结果。
  • CART 回归树 ​
    python
    from sklearn.tree import DecisionTreeRegressor
    
    reg = DecisionTreeRegressor(
        criterion='squared_error',   # 划分标准(默认为 'squared_error')
        max_depth=None,              # 树的最大深度(None 表示不限制)
        min_samples_split=2,         # 节点分裂所需的最小样本数
        min_samples_leaf=1,          # 叶节点所需的最小样本数
        random_state=None            # 随机种子(用于结果复现)
    )
    • ​​criterion​​ 衡量划分质量的标准。

      • ​'squared_error'​:使用**均方误差(MSE)**作为损失函数,即最小化子区域内的平方损失之和,是 CART 回归树的标准准则(默认选项)。
      • (注:在较新版本的 scikit-learn 中,'mse'​ 已被弃用,统一使用 'squared_error'​)
    • ​​max_depth​​ 决策树的最大深度。

      • 若为 None​(默认),树会持续分裂直到所有叶节点纯净(即每个叶子内目标值完全相同)或满足其他停止条件,容易过拟合。
      • 设置较小的整数(如 3~10)可有效限制模型复杂度,提升泛化能力。
    • ​​min_samples_split​​ 一个内部节点要被分裂所需的最小样本数量。

      • 默认值为 2​,表示只要节点包含至少 2 个样本就可能继续分裂。
      • 增大该值可避免在噪声或小样本区域过度拟合,使模型更稳健。
    • ​​min_samples_leaf​​ 每个叶节点必须包含的最小样本数量。

      • 默认值为 1​,允许叶节点仅包含一个样本,可能导致过拟合。
      • 增大该值(如设为 5 或 10)可确保每个预测基于足够多的样本,使预测更平滑、稳定。
    • ​​random_state​​ 控制随机性的种子。

      • 若为 None​(默认),当存在多个等效切分点时,选择可能具有随机性,导致多次训练结果不一致。
      • 设为整数(如 42​)可确保每次运行得到完全相同的回归树,便于实验复现和调试。

无监督学习 ​

K-Means ​

【案例】k-means-将随机创建的数据进行聚类

python
from sklearn.cluster import KMeans

kmeans = KMeans(
    n_clusters=8,               # 聚类簇的数量(K值)
    init='k-means++',           # 初始聚类中心的选取方法
    n_init=10,                  # 使用不同初始中心运行算法的次数
    max_iter=300,               # 单次运行的最大迭代次数
    tol=1e-4,                   # 收敛判定的容差(基于惯性变化)
    verbose=0,                  # 是否输出详细日志
    random_state=None,          # 随机种子(用于结果复现)
    copy_x=True,                # 是否复制输入数据(避免修改原始数据)
    algorithm='lloyd'           # 使用的KMeans算法变体
)
  • 参数

    • ​​n_clusters​​:要形成的聚类簇数量(即 K 值)。

      • 默认为 8​,生成的聚类数,即:产生的质心(clusters)数
      • 必须根据业务或数据特性手动设定。
      • 实际应用中常通过 肘部法则(Elbow Method) 或 轮廓系数(Silhouette Score) 辅助选择最优 K。
    • ​​init​​:初始聚类中心的生成策略。

      • ​'k-means++'​(默认):

        • 智能初始化:第一个中心随机选,后续中心按距离现有中心较远的概率选取。
        • 显著提升收敛速度和最终聚类质量,强烈推荐保留默认。
      • ​'random'​:

        • 随机从数据中选择 K 个点作为初始中心,容易陷入较差局部最优。
      • 也可传入形状为 (n_clusters, n_features)​ 的数组,自定义初始中心。

    • ​​n_init​​:使用不同随机初始化运行 KMeans 的次数。

      • 默认为 10​(当 init='k-means++'​ 时)。
      • 最终返回惯性(inertia)最小(即簇内平方和最小)的那次结果。
      • 若设 init='random'​,建议增大此值(如 20~50)以提高稳定性。
    • ​​max_iter​​:单次运行的最大迭代次数。

      • 默认为 300​。通常足够收敛;若数据规模大或结构复杂,可适当增加。
      • 若未在 max_iter​ 内收敛,会发出警告(可通过 verbose​ 查看)。
    • ​​tol​​(tolerance):判定算法是否收敛的阈值。

      • 默认为 1e-4​。
      • 当连续两次迭代的簇中心变化所引起的惯性下降小于 ​tol​​ 时,算法停止。
      • 值越小,结果越精确,但可能增加迭代次数。
    • ​​random_state​​:随机种子

      • 控制初始化和 n_init​ 中的随机性。
      • 设为固定整数(如 42​)可确保实验可复现。
      • 仅当 ​init='random'​ ​ 或 ​n_init &gt; 1​​ 时才起作用(k-means++​ 本身也含随机性)。
    • ​​copy_x​​:

      • 默认为 True​,表示在预处理(如中心化)时不修改原始输入数据 X​。
      • 若内存受限且不关心原始数据,可设为 False​ 以节省空间(但谨慎使用)。
    • ​​algorithm​​:底层使用的 KMeans 算法实现。

      • ​'lloyd'​(默认):经典 EM 式迭代(旧称 "expectation-maximization")。
      • ​'elkan'​:利用三角不等式加速,在低维数据上更快;但在高维或稀疏数据上可能更慢。
      • ​'auto'​:自动选择(sklearn ≥1.1 后已弃用,统一用 'lloyd'​)。
      • ⚠️ 注意:'full'​ 是旧版本别名,现已废弃。
  • 方法

    • ​ ​.fit(X)​ ​:训练模型,计算聚类中心。

    • ​ ​.labels_​ ​:每个样本所属的簇标签(长度为 n_samples​ 的整数数组)。

    • ​ ​.cluster_centers_​ ​:形状为 (n_clusters, n_features)​ 的聚类中心坐标。

    • ​ ​.inertia_​ ​:簇内平方和(Within-Cluster Sum of Squares, WCSS) ,值越小表示簇越紧凑

      • 公式:$ \text{inertia} = \sum_{i=1}^{n} \min_{\mu_j \in C} |x_i - \mu_j|^2 $
      • 是选择 K 值(肘部法则)的核心指标。
    • ​ ​.predict(X)​ ​:对新样本分配簇标签(基于最近的聚类中心)。

    • ​ ​.score(X)​ ​:返回负的 inertia(sklearn 统一接口要求“越大越好”)。

模型评估 ​

分类评估 ​

  • 准确率 ​
    python
    # 方式一:
    estimator.score(x_text, y_text)
    
    # 方式二:
    from sklearn.metrics import accuracy_score
    accuracy_score(y_text, estimator.predict(x_test))
  • 混淆矩阵 ​
    python
    from sklearn.metrics import confusion_matrix    
    import pandas as pd
    cm = confusion_matrix(
        y_true=y_true,          # 真实标签
        y_pred=y_pred,          # 预测标签
        labels=labels           # 指定类别顺序(可选,但推荐)
    )
    # 转换为 DataFrame 便于阅读(行=真实,列=预测)
    df_cm = pd.DataFrame(
        cm,
        index=[f"真实_{label}" for label in labels],      # 行标签:真实类别
        columns=[f"预测_{label}" for label in labels]     # 列标签:预测类别
    )
  • 精确率 ​
    python
    precision = precision_score(
        y_true=y_true,
        y_pred=y_pred,
        average='weighted',     # 常用选项:'binary'(仅二分类)、'micro'、'macro'、'weighted'
        zero_division=0         # 当分母为0时返回0(避免警告)
    )
    #【注】对于多分类问题,必须指定 average 参数;若为二分类,可直接写 pos_label 指定正例
    # 说明:
    # - 'binary': 仅适用于二分类,需配合 pos_label
    # - 'micro': 全局计算 TP/(TP+FP),等价于 accuracy(多分类)
    # - 'macro': 各类别的 precision 简单平均(不考虑类别不平衡)
    # - 'weighted': 各类别的 precision 按其支持数(样本数)加权平均(推荐)
  • 召回率

    python
    from sklearn.metrics import recall_score        
    recall = recall_score(
        y_true=y_true,
        y_pred=y_pred,
        average='weighted',
        zero_division=0
    )
  • F1值

    python
    from sklearn.metrics import f1_score
    f1 = f1_score(
        y_true=y_true,
        y_pred=y_pred,
        average='weighted',
        zero_division=0
    )
  • ROC AUC ​
    python
    # 需要预测概率,而非预测标签!
    y_proba = model.predict_proba(X)   # shape: (n_samples, n_classes)
    from sklearn.metrics import roc_auc_score
    roc_auc = roc_auc_score(
    	y_true=y_true,				# 每个样本的真实类别,必须为0(反例),1(正例)标记
    	y_score=y_proba,            # 预测得分,可以是正例的估计概率、置信值或者分类器方法的返回值
    	multi_class='ovr',          # 或 'ovo'(One-vs-One)
    	average='weighted'          # 可选:'macro'(二分类下可省略), 'weighted'
    )
  • 分类报告 ​
    python
    # 一次性输出 precision, recall, f1-score, support(各类别样本数)等详细指标
    from sklearn.metrics import classification_report
    report = classification_report(
        y_true=y_true,
        y_pred=y_pred,
        target_names=labels,      # 类别名称(与 labels 顺序一致)
        digits=4,                 # 小数位数
        zero_division=0           # 避免除零警告
    )

    分类报告

    text
    分类评估报告:
                  precision  recall  f1-score  support
    False           0.82     0.89      0.85     1036
    True            0.60     0.47      0.53      373
    
    accuracy                           0.78     1409
    macro avg       0.71     0.68      0.69     1409
    weighted avg    0.76     0.78      0.77     1409
    • 各列含义

      • precision(精确率):预测为该类别的样本中,真正属于该类的比例。
      • recall(召回率):所有真实属于该类的样本中,被正确预测出来的比例。
      • f1-score(F1值):精确率和召回率的调和平均数,综合衡量模型性能。
      • support(支持数):该类别在真实标签中的样本数量(即 TP + FN)
    • 各行含义

      • precision=0.82 → 所有被预测为 False​ 的样本中,82% 是真正的 False​。

      • precision=0.60 → 所有被预测为 True​ 的样本中,只有 60% 是真正的 True​(误报较多)。

      • ​accuracy​(准确率):所有样本中,被正确分类的比例。

      • ​macro avg​(宏平均):不考虑各类别样本数量,直接对每个类别的指标取算术平均。

        • macro_precision = (0.82 + 0.60) / 2 = 0.71
      • ​weighted avg​(加权平均):按每个类别的样本数量(support)进行加权平均。

        • weighted_precision = (0.82 × 1036 + 0.60 × 373) / 1409 ≈ 0.76

回归评估 ​

平均绝对误差,MAE ​
python
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)
均方误差,MSE ​
python
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)

均方根误差 ,RMSE

python
from sklearn.metrics import root_mean_squared_error
root_mean_squared_error(y_test,y_predict)

聚类评估 ​

【案例】聚类算法的评估指标

SSE(Sum of Squared Errors,误差平方和) ​
python
# SSE 可直接从 KMeans 模型的 inertia_ 属性获取
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
sse = kmeans.inertia_  # 即 SSE 值
SC 轮廓系数(Silhouette Coefficient, SC) ​
python
from sklearn.metrics import silhouette_score

score = silhouette_score(X, labels, metric='euclidean')
  • ​​X​​:形状为 (n_samples, n_features)​ 的样本特征矩阵。

    • 必须是数值型数据,通常已标准化;
    • 与 labels​ 一一对应(第 ii 行对应第 ii 个标签)。
  • ​​labels​​:长度为 n_samples​ 的一维数组,表示每个样本的聚类标签。

    • 标签为非负整数(如 [0, 1, ..., k-1]​);
    • 至少包含 2 个不同簇(否则无法计算)。
  • ​​metric​​:距离度量方式(默认 'euclidean'​)。

    • 支持 'manhattan'​、'cosine'​ 等,需与聚类算法使用的距离一致。
  • 返回值:一个浮点数,即平均轮廓系数。

    • 取值范围: [−1,1]

      • 接近 1:样本远离其他簇,聚类效果极佳;
      • 接近 0:样本位于簇边界,聚类模糊;
      • 接近 -1:样本可能被错误分配(更接近其他簇)。
CH 指数(Calinski-Harabasz Score) ​
python
from sklearn.metrics import calinski_harabasz_score

score = calinski_harabasz_score(X, labels)
  • ​​X​​:形状为 (n_samples, n_features)​ 的样本特征矩阵。

    • 要求是数值型数据(通常已标准化)。
    • 必须与 labels​ 对应(即第 i 行样本对应第 i 个标签)。
  • ​​labels​​:长度为 n_samples​ 的一维数组,表示每个样本所属的聚类簇标签。

    • 标签值应为非负整数(如 [0, 1, 2, ..., K-1]​)。
    • 至少包含 2 个不同的簇标签(否则无法计算)。
  • 返回值:一个浮点数,即 Calinski-Harabasz 指数。

    • 值越大越好,表示簇间分离度高、簇内紧凑。

模型调优 ​

交叉验证+网格搜索 API ​

【案例】基于KNN+交叉验证+网络搜索对鸢尾花分类

python
sklearn.model_selection.GridSearchCV(  # 创建交叉验证对象
    estimator,      # 估计器对象
    param_grid,     # 超参数网格,例如:{'C': [1, 10, 100]}
    scoring=None,   # 评分标准
    cv=None,        # 几折交叉验证
    n_jobs=None,    # 并行任务数
    verbose=0       # 输出日志详细程度(整数)
) 
# 返回结果:
# best_estimator_: 最佳估计器对象
# best_params_: 最佳参数
# best_score_: 最佳得分
# cv_results: 交叉验证的具体结果
【重点关注】estimator,param_grid,cv

模型保存和使用 ​

python
import joblib
joblib.dump(estimator, filename)  	# 保存模型
joblib.load(filename)  				# 使用模型

‍

每一篇文章,都是时间的标本