一、数据集模块 ( datasets )
1.1 数据集生成函数
1.1.1 生成回归任务数据集
make_regression(n_samples=100, n_features=100, n_informative=10, n_targets=1,
bias=0.0, effective_rank=None, tail_strength=0.5, noise=0.0,
shuffle=True, coef=False, random_state=None)
参数说明
- n_samples = 100【int】:生成样本的总数。
- n_features = 100【int】:每个样本的总特征数量。
- 必须 n_features ≥ n_informative。
- 注意:高维特征(n_features >> n_samples)可用于测试正则化回归(如 Ridge、Lasso)。
- n_informative = 10【int】:对目标变量有实际贡献的信息特征数量。
- 这些特征的系数非零,其余特征系数为零(即不参与生成 y)。
- 必须满足 0 ≤ n_informative ≤ n_features。
- 注意:控制问题的有效复杂度;n_informative 越小,稀疏性越强。
- n_targets = 1【int】:回归目标的数量(即输出维度)。
- 若为 1,y 为一维数组(形状 (n_samples,))。
- 若 >1,y 为二维数组(形状 (n_samples, n_targets)),每列是一个独立目标。
- 注意:多目标回归中,各目标共享相同的特征矩阵 X,但具有独立的系数和噪声。
- bias = 0.0【float】:目标变量的全局偏置项(即截距)。
- 生成公式为:y = X @ coef + bias + noise。
- effective_rank = None【int | None】:控制特征矩阵 X 的近似秩(即内在维度)。
- 若为 None(默认),X 的各特征相互独立(满秩)。
- 若为 int,则通过低秩矩阵近似生成 X,使其具有指定的有效秩(使用奇异值衰减)。
- 注意:用于模拟特征间存在线性相关性的现实数据;会降低 X 的条件数,影响回归稳定性。
- tail_strength = 0.5【float】:当 effective_rank 非 None 时,控制奇异值衰减的“尾部强度”。
- 值越小,非主成分的奇异值衰减越快(矩阵更接近严格低秩)。
- 值越大(趋近于1),奇异值分布越平坦。
- 仅在 effective_rank 被指定时生效。
- 注意:与 effective_rank 共同决定 X 的协方差结构。
- noise = 0.0【float】:添加到目标变量 y 中的高斯噪声标准差。
- noise=0.0 表示无噪声,y 完全由线性模型生成。
- noise>0(如 1.0)表示加入均值为0、标准差为 noise 的独立高斯噪声。
- 注意:噪声越大,回归任务越困难;常用于评估模型抗噪能力。
- shuffle = True【bool】:是否在返回前打乱样本顺序。
- 注意:打乱不影响 X 与 y 的对应关系,仅改变行顺序。
- coef = False【bool】:是否返回真实的回归系数(ground-truth coefficients)。
- 若为 False(默认),仅返回 (X, y)。
- 若为 True,返回 (X, y, coef),其中 coef 形状为 (n_features,) 或 (n_features, n_targets)。
- 注意:返回的 coef 中,仅有前 n_informative 个元素非零(其余为0),且符号和大小由内部随机生成
- random_state = None【int | RandomState | None】:控制随机数生成器的种子。
1.1.2 生成分类任务数据集
make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=2,
n_repeated=0, n_classes=2, n_clusters_per_class=2, weights=None,
flip_y=0.01, class_sep=1.0, hypercube=True, shift=0.0, scale=1.0,
shuffle=True, random_state=None)
参数说明
- n_samples = 100【int】:生成样本的总数。
- n_features = 20【int】:每个样本的总特征数量。
- n_informative = 2【int】:对分类有判别力的信息特征数量。
- 必须满足 1 ≤ n_informative ≤ min(n_features, n_classes × n_clusters_per_class)。
- 这些特征是从高斯分布中生成并用于构造类别边界。
- 注意:若设置过高,可能导致数据过于容易分类;过低则任务太难。
- n_redundant = 2【int】:由信息特征线性组合生成的冗余特征数量。
- 必须满足 n_informative + n_redundant + n_repeated ≤ n_features。
- 冗余特征不增加新信息,但可能影响模型性能(如多重共线性)。
- 注意:若 n_informative = 0,则无法生成冗余特征,会报错。
- n_repeated = 0【int】:从信息特征和冗余特征中随机复制得到的重复特征数量。
- 用于模拟真实数据中的重复测量或冗余变量。
- 取值范围:0 ≤ n_repeated ≤ n_features - n_informative - n_redundant。
- 注意:重复特征完全相同,可用于测试特征选择算法。
- n_classes = 2【int】:目标变量的类别数量,必须 ≥ 2。
- 注意:类别数越多,生成的数据结构越复杂,需确保 n_informative 足够支撑多类分离。
- n_clusters_per_class = 2【int】:每个类别包含的簇(cluster)数量。
- 每个簇代表该类别中的一个局部高密度区域。
- 总簇数 = n_classes × n_clusters_per_class。
- 注意:簇越多,类内结构越复杂;若设为1,则每类为单峰分布。
- weights = None【ArrayLike | None】:各类别的先验概率(或样本比例)。
- 若为 None,则各类别样本数大致相等。
- 若指定(如 [0.7, 0.3]),则按比例分配样本,且长度必须等于 n_classes。
- 注意:实际样本数受 n_samples 和随机性影响,可能略有偏差;若比例之和不为1,会自动归一化。
- flip_y = 0.01【float】:随机翻转标签的比例(引入噪声)。
- 取值范围 [0.0, 1.0]。0.0 表示无噪声;0.1 表示约 10% 的标签被随机打乱,用于模拟现实中的标注错误。
- 翻转后的标签在所有类别中均匀随机分配(包括原类别)。
- 注意:flip_y > 0 会降低数据可分性,适合测试鲁棒性。
- class_sep = 1【float】:类别之间的分离程度。
- 值越大,类别间距离越远,分类越容易。
- hypercube = True【bool】:是否将类别中心放置在超立方体的顶点上。
- 若为 True,类别中心位于 [-class_sep, class_sep]^n_informative 的顶点,结构更规则。
- 若为 False,类别中心随机分布在球体内。
- 注意:设为 False 可增加数据多样性,但可能降低类别可分性。
- shift = 0【ArrayLike | float | None】:对所有特征整体平移的偏移量。
- 若为 float,所有特征统一加上该值。
- 若为 ArrayLike(长度 = n_features),每个特征分别平移。
- 若为 None,则不进行平移。
- 注意:平移不影响分类难度,但可模拟非零均值特征。
- scale = 1【ArrayLike | float | None】:对所有特征进行缩放的比例因子。
- 若为 float(如 2.0),所有特征乘以该值。
- 若为 ArrayLike(长度 = n_features),每个特征独立缩放。
- 若为 None,则不缩放。
- 注意:缩放改变特征量纲,可能影响基于距离的算法(如KNN. SVM)。
- shuffle = True【bool】:是否在返回前打乱样本顺序
- 注意:通常应保持 True 以避免引入人为顺序偏差。
- random_state = None【int | RandomState | None】:控制随机数生成器的种子
1.1.3 聚类数据生成
make_blobs(n_samples=100, centers=3, cluster_std=1.0, center_box=(-10.0, 10.0),
shuffle=True, random_state=None, return_centers=False)
参数说明
-
n_samples = 100【int | ArrayLike】:生成样本的总数或每个簇的样本数量。
-
若为 int,总样本数均匀分配给各簇(除非 centers 指定不等权重)。
-
若为 ArrayLike(如 [50, 100, 150]),则分别指定每个簇的样本数;长度必须等于 centers 的数量。
-
注意:当与 weights 同时使用时,weights 会被忽略;实际行为由 n_samples 的类型决定。
-
-
centers = 3【int | ArrayLike】:簇(中心点)的数量或具体坐标。
-
若为 int,则随机生成该数量的中心点(在 [-10, 10] 范围内)。
-
若为 ArrayLike(如 [[0,0], [2,2], [-2,2]]),则直接使用这些坐标作为簇中心;此时 n_features 自动推断为坐标的维度。
-
注意:若提供 centers 为数组,则 n_features 必须与其中心点维度一致,且不能同时指定与之冲突的 n_features。
-
-
cluster_std = 1.0【float | ArrayLike】:每个簇的标准差(控制簇的紧密程度)。
-
若为 float(如 0.5),所有簇使用相同标准差。
-
若为 ArrayLike(如 [0.5, 1.0, 1.5]),则分别为每个簇指定标准差;长度必须等于 centers 数量。
-
取值越大,簇越分散;过大会导致簇重叠,增加聚类难度。
-
注意:标准差作用于每个特征维度,假设各维度独立同分布。
-
-
center_box = (-10.0, 10.0)【tuple[float, float]】:当 centers 为 int 时,随机生成中心点的边界框(最小值, 最大值)。
-
默认在 [-10, 10] 区间内均匀采样中心坐标,若如center_box=(-5.0, 5.0) 将中心限制在更小区域,可能增加簇重叠风险。
-
注意:仅当 centers 为整数时生效;若 centers 为数组,则此参数被忽略。
-
-
shuffle = True【bool】:是否在返回前打乱样本顺序。
- 若为 False,样本按簇顺序排列(先簇0,再簇1,依此类推)。
-
random_state = None【int | RandomState | None】:控制随机数生成器的种子。
- 注意:影响中心点生成(当 centers 为 int)、样本扰动(由 cluster_std 决定)和 shuffle 行为。
-
return_centers = False【bool】:是否同时返回真实的簇中心坐标。
-
若为 False(默认),仅返回 (X, y),即样本和标签。
-
若为 True,返回 (X, y, centers),便于评估聚类算法对中心的估计精度。
-
注意:当 centers 参数本身是数组时,返回的 centers 与输入一致;若 centers 是 int,则返回实际生成的中心坐标。
-
1.1.4 其他生成函数
make_classification:生成用于分类的高维人工数据集(含信息特征、冗余特征等)make_regression:生成用于回归的人工数据集(可控制噪声、特征相关性等)make_blobs:生成聚类中心明确的各向同性高斯分布簇(常用于聚类可视化)make_moons:生成两个交错半圆形状的二分类数据(非线性可分)make_circles:生成同心圆形状的二分类数据(非线性可分)make_friedman1/2/3:生成基于 Friedman 公式的回归数据集make_hastie_10_2:生成二分类数据(Hastie et al. 提出的 10 维问题)make_sparse_coded_signal:生成稀疏编码信号make_low_rank_matrix:生成低秩矩阵make_s_curve/make_swiss_roll:生成流形学习用的 S 形曲线或瑞士卷数据。
1.2 内置数据集
| 数据集名称 | 任务类型 | 说明 |
|---|---|---|
load_breast_cancer |
二分类 | 乳腺癌威斯康星州数据集 |
load_iris |
多分类 | 鸢尾花数据集 |
load_wine |
多分类 | 葡萄酒识别数据集 |
load_digits |
多分类 | 手写数字图像数据 (0-9,8×8像素) |
load_linnerud |
多输出回归 | Linnerud数据集 |
load_diabetes |
回归 | 糖尿病数据集 |
fetch_california_housing |
回归 | 加州房价数据集 |
fetch_covtype |
分类 | 森林覆盖类型数据集 (大型) |
fetch_20newsgroups |
文本分类 | 20类新闻组文本数据 |
fetch_20newsgroups_vectorized |
文本分类 | 已TF-IDF向量化的20newsgroups数据 |
fetch_kddcup99 |
KDD Cup 1999 网络入侵检测数据集 | |
fetch_lfw_pairs/fetch_lfw_people |
Labeled Faces in the Wild 人脸数据 |
注意:波士顿房价预测数据集load_boston 已被弃用
二、数据预处理模块 ( preprocessing )
2.1 编码方法
2.1.1 标签编码
LabelEncoder()
用途:将类别标签转换为 0,1,2,... 的整数编码 (仅接受一维数组y)
方法:
fit(y)transform(y)fit_transform(y)inverse_transform(y_encoded)
属性:
classes_->list:编码顺序对应的标签列表
注意:仅用于目标变量 y 的编码
2.1.2 有序编码
OrdinalEncoder()
-
用途:将类别特征转换为整数编码 (接受二维数组或DataFrame)
-
方法:
fit(X, y=None)transform(X)fit_transform(X)inverse_transform(X_encoded)
-
属性:
categories_:每列的类别列表feature_names_in_:特征名n_features_in_:特征数量
2.1.3 独热编码 (OneHotEncoder)
OneHotEncoder()
- 用途:将类别特征转换为独热编码的稀疏矩阵
- 关键参数:
sparse_output=Truehandle_unknown='ignore'
2.2 特征扩展
2.2.1 多项式扩展
PolynomialFeatures(degree=2, interaction_only=False, include_bias=True, order='C')
参数说明
-
degree = 2【int | tuple[int, int]】:多项式的最高阶数。
-
若为 int(如 3),生成从 0 阶到该阶的所有交叉项(默认包含低阶)。
-
若为 tuple(如 (2, 3)),则仅生成指定范围内的阶数(scikit-learn ≥ 1.5 支持;旧版本仅支持 int)。
-
注意:degree 越高,特征数量呈组合爆炸增长(尤其当 n_features 较大时);例如 n_features=10, degree=3 会产生 286 个特征。
-
-
interaction_only = False【bool】:是否仅生成交互项(即不含单个特征的高次幂)。
-
若为 False(默认),生成所有多项式项,包括 x₁², x₂³ 等纯幂项。
-
若为 True,则只保留不同特征的乘积项(如 x₁x₂, x₁x₂x₃),且每个特征在单项中最多出现一次。
-
示例:原始特征 [x₁, x₂],degree=2 时:
- interaction_only=False → [1, x₁, x₂, x₁², x₁x₂, x₂²]
- interaction_only=True → [1, x₁, x₂, x₁x₂]
-
注意:设为 True 可显著减少特征数量并避免过拟合,适用于关注特征间协同效应的场景。
-
-
include_bias = True【bool】:是否包含全1的偏置列(即 0 次项,对应常数项 1)。
-
若为 True(默认),输出矩阵第一列为 1(对应截距项)。
-
注意:若后续使用 LinearRegression(fit_intercept=True),通常可设 include_bias=False 以避免冗余;但若 fit_intercept=False,则需保留 bias 列以建模常数项。
-
-
order = 'C'【str】:输出数组的内存布局顺序。
-
可选 'C'(行优先,C-style)或 'F'(列优先,Fortran-style),默认为 'C',与 NumPy 默认一致。
-
注意:一般用户无需修改;仅在特定性能优化或与底层库交互时才需调整。
-
2.3 标准化与归一化
2.3.1 标准缩放器
StandardScaler()
- Z-score标准化:\(s = \frac{s - s.mean()}{s.std()}\\\)
2.3.2 最小最大缩放器
MinMaxScaler()
- 缩放至 [0, 1] 或指定范围:\(m = \frac{m - m.min()}{m.max() - m.min()}\\\)
2.3.3 鲁棒缩放器
RobustScaler()
- 基于中位数和四分位数,对异常值不敏感
2.3.4 归一化
Normalizer(norm='l2', copy=True)
用途:用于对每个样本(即数据矩阵的每一行)进行独立的范数归一化,使其具有单位长度(unit norm),常用于文本挖掘、聚类或需要消除样本尺度影响的场景(如使用余弦相似度时)。
参数:
-
norm = 'l2'【str】:指定使用的范数类型。
- 若为 'l2'(默认),将每个样本缩放为欧几里得范数(L2 范数)为 1,即 ( \frac{x}{|x|_2} )。
- 若为 'l1',将每个样本缩放为 L1 范数(绝对值之和)为 1,即 ( \frac{x}{|x|_1} )。
- 若为 'max',将每个样本缩放为最大绝对值为 1(也称 L∞ 归一化),即 ( \frac{x}{|x|_\infty} )。
- 注意:归一化是按行进行的(axis=1),与 StandardScaler 等按列(特征)标准化不同。
-
copy = True【bool】:是否在变换时创建输入数据的副本。
2.4 离散化
2.4.1 KBinsDiscretizer
KBinsDiscretizer(n_bins=5, encode='onehot', strategy='quantile',
dtype=None, subsample=200_000, random_state=None)
用途:用于将连续特征离散化为若干个分箱(bin),将数值型数据转换为类别型表示,适用于提升模型对非线性关系的鲁棒性、减少异常值影响或适配仅支持离散输入的算法。
参数说明
- n_bins = 5【int | ArrayLike】:每个特征的分箱数量。
-
若为 int,所有特征使用相同的分箱数。
-
若为 ArrayLike(如 [5, 10, 3]),则分别为每个特征指定分箱数;长度必须等于特征数量(n_features)。
-
取值必须 ≥ 2。
-
注意:分箱数越多,保留的原始信息越精细,但可能引入噪声;过少则丢失细节。某些策略(如 'quantile')在样本不足时可能无法生成指定数量的有效分箱。
-
encode = 'onehot'【str】:离散化后的编码方式。
-
若为 'onehot'(默认),输出稀疏的 one-hot 编码矩阵(每个 bin 对应一个二元特征)。
-
若为 'onehot-dense',输出稠密的 one-hot 编码矩阵(NumPy 数组而非稀疏矩阵)。
-
若为 'ordinal',输出每个样本所属的 bin 索引(整数,从 0 开始),形状与输入相同。
-
注意:'onehot' 适合大多数分类模型;'ordinal' 适用于树模型(如 DecisionTree)或需保持维度紧凑的场景。
-
-
strategy = 'quantile'【str】:分箱策略,决定如何划分区间。
-
若为 'uniform',将特征值范围等宽划分(即每个 bin 的宽度相同)。
- 对异常值敏感:若数据分布偏斜,可能导致某些 bin 样本极少甚至为空。
-
若为 'quantile'(默认),按分位数划分,使每个 bin 包含大致相等数量的样本。
- 更鲁棒于偏态分布;但若存在大量重复值,可能导致 bin 边界重合。
-
若为 'kmeans',使用一维 KMeans 聚类中心确定 bin 边界,最小化 bin 内方差。
- 能更好地适应数据局部密度,但计算开销略高。
-
注意:所有策略均在 fit 阶段基于训练数据计算 bin 边界,transform 阶段直接映射;测试集中的值若超出训练范围,会被分配到最近的 bin(不会报错)。
-
-
dtype = None【type | None】:输出数据的数据类型。
-
若为 None(默认),根据 encode 自动选择:
- 'onehot' / 'onehot-dense' → np.float64
- 'ordinal' → np.float64(即使 bin 索引为整数)
-
若显式指定(如 np.int32),仅在 encode='ordinal' 时生效;对于 one-hot 编码,dtype 必须为浮点型(因稀疏矩阵限制)。
-
注意:scikit-learn 推荐保留默认行为;手动设置 dtype 需确保兼容性。
-
-
subsample = 200_000【int | None】:用于 'quantile' 或 'kmeans' 策略时的采样数量上限。
-
为加速分位数或 KMeans 计算,当 n_samples > subsample 时,会随机采样子集进行 bin 边界估计。
-
若为 None,则使用全部样本。
-
默认 200,000 在精度与效率间取得平衡。
-
注意:仅影响 fit 阶段的计算速度,不影响最终 transform 的确定性(若 random_state 固定)。
-
-
random_state = None【int | RandomState | None】:控制 subsample 采样的随机状态。
三、不平衡数据处理 ( imblearn )
3.1 过采样 (over_sampling)
3.1.1 ADASYN
3.1.2 SMOTE
概念:Synthetic Minority Over-sampling Technique,合成少数类过采样技术}
用途:用于解决分类任务中的类别不平衡问题。通过对少数类样本在其近邻之间插值,生成新的合成样本,从而增加少数类的代表性,改善模型对少数类的识别能力。
参数
-
sampling_strategy = 'auto'【float | str | dict | callable】:指定重采样策略,控制目标类别比例。
- 若为 'auto'(默认),对所有少数类进行过采样,使其数量等于多数类(即 1:1)。
- 若为 float(如 0.5),仅适用于二分类,表示少数类 / 多数类 的目标比例(必须 ∈ (0, 1])。
- 若为 dict(如 {0: 200, 1: 300}),显式指定每个类别的最终样本数(仅对键中包含的类执行过采样)。
- 若为 callable,接收 y 值并返回目标采样策略字典。
- 注意:SMOTE 只对少数类进行过采样,不会减少多数类;若需同时欠采样,应结合如 SMOTETomek 等组合方法。
-
random_state = None【int | RandomState | None】:控制随机数生成器的种子。
-
k_neighbors = 5【int | object】:用于为每个少数类样本寻找近邻的 KNN 参数。
- 若为 int(默认 5),表示使用 k=5 的 KNeighborsClassifier 查找同类近邻。
- 若为 KNeighborsMixin 实例(如自定义的 NearestNeighbors 对象),则直接使用该对象进行近邻搜索。
- 注意:k_neighbors 必须小于少数类样本数;若少数类样本太少(如 <6),需减小该值,否则会报错。
-
n_jobs = None【int | None】:并行计算时使用的 CPU 核心数。
注意事项
- SMOTE 要求输入特征为数值型,不支持类别型特征(需先编码)。
- 生成的新样本位于少数类样本与其近邻之间的连线上(通过线性插值)。
- 在高维或稀疏数据中,SMOTE 效果可能下降(“维度灾难”导致近邻无意义)。
- 不适用于噪声大或类别边界模糊的数据,可能生成跨越决策边界的无效样本。
3.2 欠采样 (under_sampling)
3.2.1 RandomUnderSampler
3.2.2 TomekLinks
3.3 组合采样 (combine)
3.3.1 SMOTETomek
四、特征工程模块 ( feature_selection )
4.1 特征选择
4.1.1 过滤法
4.1.1.1 方差过滤
VarianceThreshold(threshold=0.0)
用途:用于特征选择,通过移除低方差的特征(即在所有样本中几乎不变的特征)来简化数据集。假设特征值为数值型且已适当缩放,方差越小说明该特征提供的信息越少。
参数
- threshold = 0.0【float】:特征保留的方差阈值,剔除所有方差 ≤ threshold 的特征。
- 默认为 0.0,表示移除在所有样本中完全不变的特征(即方差为 0)。
- 注意:该方法仅适用于数值型特征;类别型特征需先编码,且对未标准化的不同量纲特征敏感(例如,以“米”和“毫米”为单位的同一物理量方差差异巨大)。
注意事项
- VarianceThreshold 是一种无监督的过滤式(filter)特征选择方法,不依赖目标变量 y。
- 在 fit 阶段计算每个特征的方差;在 transform 阶段仅保留方差 > threshold 的列。
- 对稀疏矩阵支持良好,计算高效。 - 常用于预处理流水线的第一步,尤其适用于高维数据(如文本 TF-IDF 矩阵)中去除恒定词项。
4.1.1.2 筛选K个最佳 SelectKBest
SelectKBest(score_func=f_classif, k=10)
用途:一种基于单变量统计检验的过滤式(filter)特征选择方法,通过计算每个特征与目标变量之间的统计得分(如卡方、F值、互信息等),保留得分最高的 k 个特征,适用于降维和提升模型效率。
参数说明
- score_func = f_classif【callable】:用于评估特征重要性的评分函数。
- 必须是一个可调用对象,接收 X(特征矩阵)和 y(目标变量),返回 (scores, pvalues) 或仅 scores。
- 常见选项
- 分类任务
f_classif(默认):ANOVA F 值,适用于连续特征与类别标签chi2:卡方检验,要求特征非负(如词频、TF-IDF)mutual_info_classif:互信息,能捕捉非线性关系
- 回归任务
f_regression:F 值,基于特征与目标的相关性mutual_info_regression:互信息回归版本
- 分类任务
- 注意:必须根据任务类型和数据特性选择合适的 score_func;错误选择(如对负值使用 chi2)会导致异常。
- k = 10【int | str】:要选择的特征数量。
- 若为 'all',保留所有特征(相当于不进行选择)。
- k 必须满足 1 ≤ k ≤ n_features(当为 int 时)。
- 注意:若 k 大于特征总数,会自动调整为 n_features;若数据中存在相同得分,选择顺序可能不稳定(除非固定随机状态,但本方法本身无随机性)。
注意事项
- SelectKBest 是有监督方法,必须提供 y 进行 fit。
- 在 fit 阶段计算每个特征的得分并排序;在 transform 阶段返回 top-k 特征对应的列。
- 不改变特征原始值,仅做子集选择。
- 常用于 pipeline 中作为预处理步骤,尤其适用于高维稀疏数据(如文本)的初步筛选。
4.1.2 包装法
递归特征消除 (RFE)
RFE(estimator, n_features_to_select=None, step=1, verbose=0, importance_getter='auto')
概念:Recursive Feature Elimination,递归特征消除
用途:一种包装式(wrapper)特征选择方法,通过反复训练模型并剔除最不重要特征,最终保留指定数量的最优特征子集。适用于提升模型性能、降低过拟合风险和增强可解释性。
参数说明
-
estimator【object】:用于评估特征重要性的基础估计器(必须实现 fit 方法,并提供 coef_ 或 feature_importances_ 属性)。
- 常见选择:LinearRegression、LogisticRegression、SVC(需设置 probability=True 或使用 kernel='linear' 以支持 coef_)、RandomForestClassifier 等。
- 注意:若 estimator 不具备特征权重属性(如 KNeighborsClassifier),会报错。
-
n_features_to_select = None【int | float | None】:最终保留的特征数量。
- 若为 float(如 0.5),表示保留总特征数的该比例(向下取整)。
- 若为 None(默认),则保留总特征数的一半(即 n_features // 2)。
- 注意:必须满足 1 ≤ n_features_to_select ≤ n_features。
-
step = 1【int | float】:每轮迭代中剔除的特征数量或比例。
- 若为 float(如 0.1),每轮移除当前剩余特征的该比例(至少剔除1个)。
- 较小的 step 提高精度但增加计算开销;较大的 step 加速过程但可能跳过更优子集。
- 注意:step 必须 > 0 且 < 当前特征数。
-
verbose = 0【int】:控制输出日志的详细程度。
- 0(默认):不输出。
- ≥1:显示每轮消除的特征数量等信息。
- 注意:主要用于调试或监控长时间运行的特征选择过程。
-
importance_getter = 'auto'【str | callable】:指定如何从 estimator 获取特征重要性。
- 若为 'auto'(默认),自动检测 estimator 是否有 coef_ 或 feature_importances_。
- 若为 str(如 'coef_' 或 'feature_importances_'),显式指定属性名。
- 若为 callable,接收 estimator 并返回形状为 (n_features,) 的重要性数组。
- 注意:对于多输出模型(如 MultiOutputRegressor),重要性需聚合为一维;某些模型(如 SVM with RBF kernel)不提供 coef_,不可用于 RFE。
注意事项
- RFE 是有监督方法,需在 fit 时提供 y。
- 每轮训练 estimator → 获取特征重要性 → 剔除最不重要特征 → 重复直至达到目标特征数。
- 支持 get_support()、get_feature_names_out() 等方法获取选中的特征索引或名称。
- 计算成本较高(需多次训练模型),适用于中小规模数据集或作为最终精调步骤。
4.1.3 嵌入法
SelectFromModel
SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1,
max_features=None, importance_getter='auto')
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
estimator |
object | 已训练或待训练的估计器 |
threshold |
str/float/None | 选择阈值:'median', 'mean', 或具体数值 |
prefit |
bool (False) | estimator是否已预先拟合 |
norm_order |
int (1) | 多维系数时的范数阶数 |
max_features |
int/None | 最多保留的特征数量 |
importance_getter |
str/callable ('auto') | 获取特征重要性的方式 |
4.1.4 RFECV (带交叉验证的RFE)
RFECV(estimator, step=1, cv=None, n_jobs=None, scoring=None)
关键属性
rfecv.n_features_:最佳特征数量rfecv.estimator_:训练好的最佳模型rfecv.ranking_:特征评级 (1为保留,越大越不重要)rfecv.support_:特征是否被保留的bool列表rfecv.cv_results_:每次交叉验证得分字典
3.2 特征提取 (feature_extraction)
3.2.1 文本特征提取
| 类名 | 用途 |
|---|---|
CountVectorizer |
词频统计 |
TfidfVectorizer |
TF-IDF权重计算 |
3.2.2 字典特征提取
DictVectorizer()
- 用途:将字典列表转换为特征矩阵 (自动处理类别和数值特征)
四、监督学习模块
4.1 近邻算法 (neighbors)
4.1.1 KNN分类器 (KNeighborsClassifier)
KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto',
leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
n_neighbors |
int (5) | 邻居数量k |
weights |
str/callable ('uniform') | 权重策略:'uniform', 'distance', 或自定义函数 |
algorithm |
str ('auto') | 计算算法:'auto', 'ball_tree', 'kd_tree', 'brute' |
leaf_size |
int (30) | 树算法叶节点大小 |
p |
int (2) | Minkowski距离幂参数 (p=1曼哈顿, p=2欧氏) |
metric |
str/callable ('minkowski') | 距离度量方式 |
metric_params |
dict/None | 距离函数额外参数 |
n_jobs |
int/None | 并行任务数 |
方法:predict_proba(X_test) - 返回预测概率
4.1.2 KNN回归器 (KNeighborsRegressor)
- 参数与分类器类似,预测方式为邻居值的平均或加权平均
4.2 线性模型 (linear_model)
4.2.1 线性回归 (LinearRegression)
LinearRegression(fit_intercept=True, copy_X=True, n_jobs=None, positive=False)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
fit_intercept |
bool (True) | 是否计算截距项 |
copy_X |
bool (True) | 是否复制输入数据X |
n_jobs |
int/None | 并行任务数 (仅多输出回归有效) |
positive |
bool (False) | 是否强制系数为非负值 |
4.2.2 正则化线性回归
| 类名 | 正则化类型 | 特点 |
|---|---|---|
Ridge |
L2 | 岭回归,保持所有特征 |
Lasso |
L1 | 产生稀疏解,特征选择 |
ElasticNet |
L1+L2 | 弹性网络,结合两者优点 |
4.2.3 逻辑斯蒂回归 (LogisticRegression)
LogisticRegression(penalty='l2', dual=False, tol=1e-4, C=1.0, fit_intercept=True,
intercept_scaling=1.0, class_weight=None, random_state=None,
solver='lbfgs', max_iter=100, multi_class='auto', verbose=0,
warm_start=False, n_jobs=None, l1_ratio=None)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
penalty |
str ('l2') | 正则化类型:'l1', 'l2', 'elasticnet', 'none' |
dual |
bool (False) | 是否使用对偶形式 (仅penalty='l2'且solver='liblinear') |
tol |
float (1e-4) | 收敛容忍度 |
C |
float (1.0) | 正则化强度的倒数 (C越大,正则化越弱) |
fit_intercept |
bool (True) | 是否计算截距项 |
intercept_scaling |
float (1.0) | 截距缩放因子 (仅solver='liblinear') |
class_weight |
dict/str/None | 类别权重:'balanced'或自定义字典 |
solver |
str ('lbfgs') | 优化算法:'lbfgs', 'liblinear', 'newton-cg', 'sag', 'saga' |
max_iter |
int (100) | 最大迭代次数 |
multi_class |
str ('auto') | 多分类策略:'ovr', 'multinomial', 'auto' |
l1_ratio |
float/None | Elastic-Net混合比例 (仅penalty='elasticnet') |
关键说明:
- solver选择:小规模数据用'liblinear';大规模用'sag'/'saga';多分类用'multinomial'需避免'liblinear'
- 正则化:L1实现稀疏特征选择;L2防止过拟合;Elastic-Net结合两者
4.2.4 梯度下降回归 (SGDRegressor)
SGDRegressor(loss='squared_error', penalty='l2', alpha=0.0001, l1_ratio=0.15,
fit_intercept=True, max_iter=1000, tol=1e-3, shuffle=True,
learning_rate='invscaling', eta0=0.01, early_stopping=False,
validation_fraction=0.1, n_iter_no_change=5)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
loss |
str ('squared_error') | 损失函数类型 |
penalty |
str ('l2') | 正则化类型 |
alpha |
float (0.0001) | 正则化强度 (≥0) |
l1_ratio |
float (0.15) | Elastic-Net中L1比例 |
max_iter |
int (1000) | 最大迭代次数 |
learning_rate |
str ('invscaling') | 学习率策略:'constant', 'optimal', 'invscaling', 'adaptive' |
eta0 |
float (0.01) | 初始学习率 |
early_stopping |
bool (False) | 是否启用早停 |
validation_fraction |
float (0.1) | 验证集比例 |
4.3 支持向量机 (SVM)
4.3.1 SVC (支持向量分类)
SVC(C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True,
probability=False, tol=0.001, cache_size=200, class_weight=None,
max_iter=-1, decision_function_shape='ovr', break_ties=False, random_state=None)
关键参数
| 参数 | 说明 |
|---|---|
C |
惩罚参数,控制误分类的惩罚程度 |
kernel |
核函数:'linear', 'poly', 'rbf', 'sigmoid', 'precomputed' |
gamma |
核系数,对'rbf', 'poly', 'sigmoid'有效 |
probability |
是否启用概率估计 (需训练较慢的Platt scaling) |
decision_function_shape |
多分类策略:'ovr'(一对多), 'ovo'(一对一) |
4.3.2 其他SVM类
LinearSVC:线性核SVM,适合大规模数据SVR:支持向量回归LinearSVR:线性核SVR
4.4 朴素贝叶斯 (naive_bayes)
4.4.1 分类朴素贝叶斯 (CategoricalNB)
CategoricalNB(alpha=1.0, fit_prior=True, class_prior=None, min_categories=None)
- 用途:专为离散型类别特征设计
- 输入要求:整数编码的类别型数据 (0到K-1的连续整数)
- 属性:
category_count_:各特征每个类别各值的出现次数class_log_prior_:标签对数概率feature_log_prob_:各特征类别的对数条件概率
4.4.2 多项式朴素贝叶斯 (MultinomialNB)
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- 用途:适用于非负离散特征 (词频、TF-IDF)
- 特点:所有样本共享同一特征空间 (如固定词汇表)
4.4.3 高斯朴素贝叶斯 (GaussianNB)
- 用途:适用于连续特征,假设特征服从高斯分布
4.4.4 伯努利朴素贝叶斯 (BernoulliNB)
BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- 用途:专为二值特征 (0/1) 设计
- 参数:
binarize阈值,将连续值转换为二值
4.4.5 互补朴素贝叶斯 (ComplementNB)
- 用途:对多项式分布的改进,适合不平衡文本分类
4.5 决策树 (tree)
4.5.1 决策树分类器 (DecisionTreeClassifier)
DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
max_features=None, random_state=None,
class_weight=None, ccp_alpha=0.0)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
criterion |
str ('gini') | 分割标准:'gini', 'log_loss' |
splitter |
str ('best') | 分割策略:'best'(最优), 'random'(随机) |
max_depth |
int/None | 最大树深度 |
min_samples_split |
int/float (2) | 内部节点分裂最小样本数 |
min_samples_leaf |
int/float (1) | 叶节点最小样本数 |
max_features |
int/float/str/None | 分割时考虑的特征数:'sqrt', 'log2' |
class_weight |
dict/str/None | 类别权重,处理不平衡数据 |
ccp_alpha |
float (0.0) | 代价复杂度剪枝参数 |
特点:可解释性强,无需特征缩放,易过拟合
4.5.2 决策树回归 (DecisionTreeRegressor)
- 参数类似分类器,但criterion可选'squared_error', 'friedman_mse'等
4.6 集成学习 (ensemble)
4.6.1 随机森林分类器 (RandomForestClassifier)
RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
max_features='sqrt', bootstrap=True, oob_score=False,
n_jobs=None, random_state=None, class_weight=None,
ccp_alpha=0.0, max_samples=None)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
n_estimators |
int (100) | 森林中决策树数量 |
bootstrap |
bool (True) | 是否使用自助采样构建每棵树 |
oob_score |
bool (False) | 是否计算袋外样本评估 |
max_samples |
int/float/None | 每棵树bootstrap采样数量 |
属性:
feature_importances_:特征重要性estimators_:所有决策树列表oob_score_:袋外准确率 (需启用)
4.6.2 极端随机树 (ExtraTreesClassifier)
ExtraTreesClassifier(n_estimators=100, criterion='gini', max_depth=None,
min_samples_split=2, min_samples_leaf=1,
max_features='sqrt', bootstrap=False, oob_score=False)
核心区别:分割点完全随机选择,而非搜索最优切分点
- 优点:训练速度极快,方差更低
- 默认:
bootstrap=False(随机性已足够强)
4.6.3 梯度提升分类器 (GradientBoostingClassifier)
- 基于梯度提升框架,逐步构建决策树
4.6.4 XGBoost (HistGradientBoostingClassifier)
- 使用直方图算法的梯度提升,适合大规模数据
4.6.5 投票分类器 (VotingClassifier)
- 集成多个分类器,通过投票机制预测
4.6.6 堆叠分类器 (StackingClassifier)
- 分层训练,元学习器综合多个基学习器预测
4.7 神经网络 (neural_network)
4.7.1 多层感知器分类器 (MLPClassifier)
MLPClassifier(hidden_layer_sizes=(100,), activation='relu', solver='adam',
alpha=0.0001, batch_size='auto', learning_rate='constant',
learning_rate_init=0.001, max_iter=200, random_state=None)
4.7.2 多层感知器回归器 (MLPRegressor)
- 参数类似分类器,支持回归任务
五、无监督学习模块
5.1 聚类 (cluster)
5.1.1 K-Means聚类 (KMeans)
KMeans(n_clusters=8, init='k-means++', n_init='auto', max_iter=300,
tol=1e-4, verbose=0, random_state=None, algorithm='lloyd')
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
n_clusters |
int (8) | 簇数量k |
init |
str/ArrayLike ('k-means++') | 初始化方法:'k-means++', 'random' |
n_init |
int/str ('auto') | 运行次数,取最优结果 |
max_iter |
int (300) | 单次运行最大迭代次数 |
tol |
float (1e-4) | 收敛容忍度 |
algorithm |
str ('lloyd') | 算法变体:'lloyd', 'elkan' (已弃用) |
属性:cluster_centers_, labels_, inertia_
5.1.2 其他聚类算法
MiniBatchKMeans:小批次K-Means,适合大规模数据AgglomerativeClustering:层次聚类DBSCAN:基于密度的聚类OPTICS:改进的密度聚类
5.2 降维
5.2.1 流形学习 (manifold)
TSNE:t-分布随机邻域嵌入 (可视化)MDS:多维缩放Isomap:等距映射LocallyLinearEmbedding:局部线性嵌入
5.2.2 线性降维 (decomposition)
PCA:主成分分析TruncatedSVD:截断SVD (适用于稀疏矩阵)KernelPCA:核PCA (非线性降维)
六、模型评估模块
6.1 评估指标 (metrics)
6.1.1 分类评估
| 函数 | 用途 |
|---|---|
accuracy_score |
准确率 |
f1_score |
F1分数 (综合精确率和召回率) |
recall_score |
召回率 (查全率) |
precision_score |
精确率 (查准率) |
confusion_matrix |
混淆矩阵 |
classification_report |
分类报告 (包含多个指标) |
roc_curve |
ROC曲线 |
roc_auc_score |
ROC AUC分数 |
precision_recall_curve |
精确率-召回率曲线 |
auc |
计算曲线下的面积 |
6..2 回归评估
| 函数 | 用途 |
|---|---|
mean_squared_error |
均方误差 (MSE) |
mean_absolute_error |
平均绝对误差 (MAE) |
r2_score |
R²分数 (决定系数) |
注意:np.sqrt(mse) 可得RMSE
6.1.3 聚类评估
| 函数 | 是否需要真实标签 | 说明 |
|---|---|---|
silhouette_score |
否 | 轮廓系数 (评估簇内紧密度和簇间分离度) |
davies_bouldin_score |
否 | Davies-Bouldin指数 (值越小越好) |
calinski_harabasz_score |
否 | Calinski-Harabasz指数 (值越大越好) |
adjusted_rand_score |
是 | 调整兰德指数 |
normalized_mutual_info_score |
是 | 归一化互信息 |
6.2 模型选择 (model_selection)
6.2.1 数据集切分
train_test_split(X, y, train_size=None, test_size=None, shuffle=True, random_state=None)
关键说明:
- shuffle=True:避免数据顺序引入的分布偏差
- random_state:确保结果可复现
6.2.2 交叉验证策略
| 类名 | 用途 |
|---|---|
KFold |
K折交叉验证 |
StratifiedKFold |
分层K折,保持类别比例 |
TimeSeriesSplit |
时间序列交叉验证 (不打乱) |
cross_val_score |
交叉验证评估模型 |
cross_validate |
多指标交叉验证 |
6.2.3 超参数调优
网格搜索 (GridSearchCV)
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None,
refit=True, cv=None, verbose=0)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
estimator |
object | 待调优的估计器 |
param_grid |
dict/list[dict] | 超参数网格 |
scoring |
str/callable/list/dict/None | 评估指标 |
refit |
bool/str (True) | 是否用最佳参数重新训练 |
cv |
int/iterable/CV splitter | 交叉验证策略 |
n_jobs |
int/None | 并行任务数 |
verbose |
int (0) | 日志详细程度 |
结果属性:
best_params_:最优参数best_score_:最优交叉验证得分best_estimator_:重训后的最佳模型cv_results_:所有参数组合结果
随机搜索 (RandomizedSearchCV)
RandomizedSearchCV(estimator, param_distributions, n_iter=10)
- 特点:从参数分布中随机采样,适合大规模参数空间
贝叶斯优化 (BayesSearchCV)
BayesSearchCV(estimator, search_spaces)
- 特点:基于贝叶斯优化,智能搜索参数空间
参数空间定义:
from scipy.stats import uniform, randint
param_dist = {'C':uniform(0.1, 10), 'gamma':uniform(0.001, 0.1)}
# 或使用skopt
from skopt import Real, Categorical
search_spaces = {
'C':Real(0.1, 10, prior='log-uniform'),
'gamma':Real(0.001, 0.1, prior='log-uniform'),
'kernel':Categorical(['rbf'])
}
七、工具模块
7.1 流水线 (pipeline)
7.1.1 Pipeline
Pipeline(steps, memory=None, verbose=False)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
steps |
list[tuple[str, object]] | 步骤序列:[(name, transformer/estimator)] |
memory |
str/object/None | 启用缓存以加速重复计算 |
verbose |
bool (False) | 是否打印执行日志 |
关键特性:
- 继承最后一个元素的estimator的所有属性和方法
- 参数设置:
pipe.set_params(步骤名__参数=值) - 避免数据泄露,确保训练/测试处理一致性
7.2 缺失值处理 (impute)
| 类名 | 参数 | 说明 |
|---|---|---|
SimpleImputer |
strategy='mean' |
简单填充:mean, median, most_frequent, constant |
KNNImputer |
n_neighbors=5 |
KNN近邻填充 |
7.3 多任务学习 (multioutput)
| 类名 | 用途 |
|---|---|
MultiOutputClassifier |
多标签分类 |
MultiOutputRegressor |
多输出回归 |
八、统计与可视化
8.1 统计量 (stats)
8.1.1 相关系数
pearsonr(x, y)
- 用途:计算两个向量间的皮尔逊相关系数
8.2 可视化工具
8.2.1 混淆矩阵显示
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_estimator(model, X_test, y_test,
display_labels=["负例", "正例"],
cmap=plt.cm.Blues)
8.2.2 ROC曲线显示
from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_estimator(model, X_test, y_test)
# 自动计算AUC
8.2.3 P-R曲线显示
from sklearn.metrics import PrecisionRecallDisplay
PrecisionRecallDisplay.from_estimator(model, X_test, y_test)
# 自动计算AP (Average Precision)
8.2.4 决策边界显示
from sklearn.inspection import DecisionBoundaryDisplay
DecisionBoundaryDisplay.from_estimator(estimator, X, features=[0, 1],
grid_resolution=100, response_method='auto',
plot_method='contourf', scatter=True)
参数说明
| 参数 | 类型/默认值 | 说明 |
|---|---|---|
estimator |
object | 已训练的分类器 |
X |
array-like | 原始特征数据 (用于确定绘图范围) |
features |
list[int] ([0,1]) | 用于绘制的两个特征索引 |
grid_resolution |
int (100) | 网格分辨率 |
response_method |
str ('auto') | 预测方式:'auto', 'predict', 'decision_function', 'predict_proba' |
plot_method |
str ('contourf') | 绘图方法:'contourf', 'pcolormesh' |
scatter |
bool (True) | 是否叠加原始数据散点图 |
九、模型持久化
9.1 使用joblib
from joblib import dump, load
# 保存模型
dump(model, 'model.joblib')
# 加载模型
loaded_model = load('model.joblib')
9.2 使用pickle
import pickle
# 保存模型
with open('model.pkl', 'wb') as f:
pickle.dump(model, f)
# 加载模型
with open('model.pkl', 'rb') as f:
loaded_model = pickle.load(f)
推荐:对于scikit-learn模型,优先使用joblib,效率更高
浙公网安备 33010602011771号