基础代码
数据预处理
拆分数据集
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 # 参考某一列的值
)特征工程
特征预处理
归一化
pythonsklearn.preprocessing.MinMaxScaler(feature_range=(0, 1)) # 创建归一化对象 # feature_range:归一化的范围,默认为(0, 1) fit_transform(X) # 训练并返回结果,X为特征向量pythonfrom 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)标准化
pythonsklearn.preprocessing.StandardScaler()pythonfrom 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
分类
pythonsklearn.neighbors.KNeighborsClassifier(n_eighbors=5) # 创建KNN分类器 # n_eighbors:最近邻的邻居数,即K值(默认:5) # k_eighbors:查询默认使用的邻居数pythonfrom 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]回归
pythonsklearn.neighbors.KNeighborsRegressor(n_neighbors=5) # 创建KNN回归器 # n_neighbors:最近邻的邻居数,即K值(默认:5) # k_neighbors:查询默认使用的邻居数pythonfrom 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]
线性回归
正规方程
pythonfrom 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_ # 偏置梯度下降
pythonfrom 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_ # 偏置
逻辑回归
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 分类树
【案例】泰坦尼克号乘客生存预测
pythonfrom 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 回归树
pythonfrom 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-将随机创建的数据进行聚类
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 > 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))混淆矩阵
pythonfrom 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] # 列标签:预测类别 )精确率
pythonprecision = 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 按其支持数(样本数)加权平均(推荐)召回率
pythonfrom sklearn.metrics import recall_score recall = recall_score( y_true=y_true, y_pred=y_pred, average='weighted', zero_division=0 )F1值
pythonfrom 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
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_predict)均方误差,MSE
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test,y_predict)均方根误差 ,RMSE
from sklearn.metrics import root_mean_squared_error
root_mean_squared_error(y_test,y_predict)聚类评估
【案例】聚类算法的评估指标
SSE(Sum of Squared Errors,误差平方和)
# SSE 可直接从 KMeans 模型的 inertia_ 属性获取
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
sse = kmeans.inertia_ # 即 SSE 值SC 轮廓系数(Silhouette Coefficient, SC)
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)
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+交叉验证+网络搜索对鸢尾花分类
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模型保存和使用
import joblib
joblib.dump(estimator, filename) # 保存模型
joblib.load(filename) # 使用模型