一、數據集模塊 ( 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)

參數説明

  1. n_samples = 100【int】:生成樣本的總數。
  2. n_features = 100【int】:每個樣本的總特徵數量。
  • 必須 n_features ≥ n_informative。
  • 注意:高維特徵(n_features >> n_samples)可用於測試正則化迴歸(如 Ridge、Lasso)。
  1. n_informative = 10【int】:對目標變量有實際貢獻的信息特徵數量。
  • 這些特徵的係數非零,其餘特徵係數為零(即不參與生成 y)。
  • 必須滿足 0 ≤ n_informative ≤ n_features。
  • 注意:控制問題的有效複雜度;n_informative 越小,稀疏性越強。
  1. n_targets = 1【int】:迴歸目標的數量(即輸出維度)。
  • 若為 1,y 為一維數組(形狀 (n_samples,))。
  • 若 >1,y 為二維數組(形狀 (n_samples, n_targets)),每列是一個獨立目標。
  • 注意:多目標迴歸中,各目標共享相同的特徵矩陣 X,但具有獨立的係數和噪聲。
  1. bias = 0.0【float】:目標變量的全局偏置項(即截距)。
  • 生成公式為:y = X @ coef + bias + noise。
  1. effective_rank = None【int | None】:控制特徵矩陣 X 的近似秩(即內在維度)。
  • 若為 None(默認),X 的各特徵相互獨立(滿秩)。
  • 若為 int,則通過低秩矩陣近似生成 X,使其具有指定的有效秩(使用奇異值衰減)。
  • 注意:用於模擬特徵間存在線性相關性的現實數據;會降低 X 的條件數,影響迴歸穩定性。
  1. tail_strength = 0.5【float】:當 effective_rank 非 None 時,控制奇異值衰減的“尾部強度”。
  • 值越小,非主成分的奇異值衰減越快(矩陣更接近嚴格低秩)。
  • 值越大(趨近於1),奇異值分佈越平坦。
  • 僅在 effective_rank 被指定時生效。
  • 注意:與 effective_rank 共同決定 X 的協方差結構。
  1. noise = 0.0【float】:添加到目標變量 y 中的高斯噪聲標準差。
  • noise=0.0 表示無噪聲,y 完全由線性模型生成。
  • noise>0(如 1.0)表示加入均值為0、標準差為 noise 的獨立高斯噪聲。
  • 注意:噪聲越大,迴歸任務越困難;常用於評估模型抗噪能力。
  1. shuffle = True【bool】:是否在返回前打亂樣本順序。
  • 注意:打亂不影響 X 與 y 的對應關係,僅改變行順序。
  1. coef = False【bool】:是否返回真實的迴歸係數(ground-truth coefficients)。
  • 若為 False(默認),僅返回 (X, y)。
  • 若為 True,返回 (X, y, coef),其中 coef 形狀為 (n_features,) 或 (n_features, n_targets)。
  • 注意:返回的 coef 中,僅有前 n_informative 個元素非零(其餘為0),且符號和大小由內部隨機生成
  1. 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)

參數説明

  1. n_samples = 100【int】:生成樣本的總數。
  2. n_features = 20【int】:每個樣本的總特徵數量。
  3. n_informative = 2【int】:對分類有判別力的信息特徵數量。
  • 必須滿足 1 ≤ n_informative ≤ min(n_features, n_classes × n_clusters_per_class)。
  • 這些特徵是從高斯分佈中生成並用於構造類別邊界。
  • 注意:若設置過高,可能導致數據過於容易分類;過低則任務太難。
  1. n_redundant = 2【int】:由信息特徵線性組合生成的冗餘特徵數量。
  • 必須滿足 n_informative + n_redundant + n_repeated ≤ n_features。
  • 冗餘特徵不增加新信息,但可能影響模型性能(如多重共線性)。
  • 注意:若 n_informative = 0,則無法生成冗餘特徵,會報錯。
  1. n_repeated = 0【int】:從信息特徵和冗餘特徵中隨機複製得到的重複特徵數量。
  • 用於模擬真實數據中的重複測量或冗餘變量。
  • 取值範圍:0 ≤ n_repeated ≤ n_features - n_informative - n_redundant。
  • 注意:重複特徵完全相同,可用於測試特徵選擇算法。
  1. n_classes = 2【int】:目標變量的類別數量,必須 ≥ 2。
  • 注意:類別數越多,生成的數據結構越複雜,需確保 n_informative 足夠支撐多類分離。
  1. n_clusters_per_class = 2【int】:每個類別包含的簇(cluster)數量。
  • 每個簇代表該類別中的一個局部高密度區域。
  • 總簇數 = n_classes × n_clusters_per_class。
  • 注意:簇越多,類內結構越複雜;若設為1,則每類為單峯分佈。
  1. weights = None【ArrayLike | None】:各類別的先驗概率(或樣本比例)。
  • 若為 None,則各類別樣本數大致相等。
  • 若指定(如 [0.7, 0.3]),則按比例分配樣本,且長度必須等於 n_classes。
  • 注意:實際樣本數受 n_samples 和隨機性影響,可能略有偏差;若比例之和不為1,會自動歸一化。
  1. flip_y = 0.01【float】:隨機翻轉標籤的比例(引入噪聲)。
  • 取值範圍 [0.0, 1.0]。0.0 表示無噪聲;0.1 表示約 10% 的標籤被隨機打亂,用於模擬現實中的標註錯誤。
  • 翻轉後的標籤在所有類別中均勻隨機分配(包括原類別)。
  • 注意:flip_y > 0 會降低數據可分性,適合測試魯棒性。
  1. class_sep = 1【float】:類別之間的分離程度。
  • 值越大,類別間距離越遠,分類越容易。
  1. hypercube = True【bool】:是否將類別中心放置在超立方體的頂點上。
  • 若為 True,類別中心位於 [-class_sep, class_sep]^n_informative 的頂點,結構更規則。
  • 若為 False,類別中心隨機分佈在球體內。
  • 注意:設為 False 可增加數據多樣性,但可能降低類別可分性。
  1. shift = 0【ArrayLike | float | None】:對所有特徵整體平移的偏移量。
  • 若為 float,所有特徵統一加上該值。
  • 若為 ArrayLike(長度 = n_features),每個特徵分別平移。
  • 若為 None,則不進行平移。
  • 注意:平移不影響分類難度,但可模擬非零均值特徵。
  1. scale = 1【ArrayLike | float | None】:對所有特徵進行縮放的比例因子。
  • 若為 float(如 2.0),所有特徵乘以該值。
  • 若為 ArrayLike(長度 = n_features),每個特徵獨立縮放。
  • 若為 None,則不縮放。
  • 注意:縮放改變特徵量綱,可能影響基於距離的算法(如KNN. SVM)。
  1. shuffle = True【bool】:是否在返回前打亂樣本順序
  • 注意:通常應保持 True 以避免引入人為順序偏差。
  1. 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)

參數説明

  1. n_samples = 100【int | ArrayLike】:生成樣本的總數或每個簇的樣本數量。
  • 若為 int,總樣本數均勻分配給各簇(除非 centers 指定不等權重)。
  • 若為 ArrayLike(如 [50, 100, 150]),則分別指定每個簇的樣本數;長度必須等於 centers 的數量。
  • 注意:當與 weights 同時使用時,weights 會被忽略;實際行為由 n_samples 的類型決定。
  1. centers = 3【int | ArrayLike】:簇(中心點)的數量或具體座標。
  • 若為 int,則隨機生成該數量的中心點(在 [-10, 10] 範圍內)。
  • 若為 ArrayLike(如 [[0,0], [2,2], [-2,2]]),則直接使用這些座標作為簇中心;此時 n_features 自動推斷為座標的維度。
  • 注意:若提供 centers 為數組,則 n_features 必須與其中心點維度一致,且不能同時指定與之衝突的 n_features。
  1. cluster_std = 1.0【float | ArrayLike】:每個簇的標準差(控制簇的緊密程度)。
  • 若為 float(如 0.5),所有簇使用相同標準差。
  • 若為 ArrayLike(如 [0.5, 1.0, 1.5]),則分別為每個簇指定標準差;長度必須等於 centers 數量。
  • 取值越大,簇越分散;過大會導致簇重疊,增加聚類難度。
  • 注意:標準差作用於每個特徵維度,假設各維度獨立同分布。
  1. center_box = (-10.0, 10.0)【tuple[float, float]】:當 centers 為 int 時,隨機生成中心點的邊界框(最小值, 最大值)。
  • 默認在 [-10, 10] 區間內均勻採樣中心座標,若如center_box=(-5.0, 5.0) 將中心限制在更小區域,可能增加簇重疊風險。
  • 注意:僅當 centers 為整數時生效;若 centers 為數組,則此參數被忽略。
  1. shuffle = True【bool】:是否在返回前打亂樣本順序。
  • 若為 False,樣本按簇順序排列(先簇0,再簇1,依此類推)。
  1. random_state = None【int | RandomState | None】:控制隨機數生成器的種子。
  • 注意:影響中心點生成(當 centers 為 int)、樣本擾動(由 cluster_std 決定)和 shuffle 行為。
  1. 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=True
  • handle_unknown='ignore'

2.2 特徵擴展

2.2.1 多項式擴展

PolynomialFeatures(degree=2, interaction_only=False, include_bias=True, order='C')

參數説明

  1. 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 個特徵。
  1. 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 可顯著減少特徵數量並避免過擬合,適用於關注特徵間協同效應的場景。
  1. include_bias = True【bool】:是否包含全1的偏置列(即 0 次項,對應常數項 1)。
  • 若為 True(默認),輸出矩陣第一列為 1(對應截距項)。
  • 注意:若後續使用 LinearRegression(fit_intercept=True),通常可設 include_bias=False 以避免冗餘;但若 fit_intercept=False,則需保留 bias 列以建模常數項。
  1. 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),常用於文本挖掘、聚類或需要消除樣本尺度影響的場景(如使用餘弦相似度時)。

參數

  1. 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 等按列(特徵)標準化不同。
  1. 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),將數值型數據轉換為類別型表示,適用於提升模型對非線性關係的魯棒性、減少異常值影響或適配僅支持離散輸入的算法。

參數説明

  1. n_bins = 5【int | ArrayLike】:每個特徵的分箱數量。
  • 若為 int,所有特徵使用相同的分箱數。
  • 若為 ArrayLike(如 [5, 10, 3]),則分別為每個特徵指定分箱數;長度必須等於特徵數量(n_features)。
  • 取值必須 ≥ 2。
  • 注意:分箱數越多,保留的原始信息越精細,但可能引入噪聲;過少則丟失細節。某些策略(如 'quantile')在樣本不足時可能無法生成指定數量的有效分箱。
  1. encode = 'onehot'【str】:離散化後的編碼方式。
  • 若為 'onehot'(默認),輸出稀疏的 one-hot 編碼矩陣(每個 bin 對應一個二元特徵)。
  • 若為 'onehot-dense',輸出稠密的 one-hot 編碼矩陣(NumPy 數組而非稀疏矩陣)。
  • 若為 'ordinal',輸出每個樣本所屬的 bin 索引(整數,從 0 開始),形狀與輸入相同。
  • 注意:'onehot' 適合大多數分類模型;'ordinal' 適用於樹模型(如 DecisionTree)或需保持維度緊湊的場景。
  1. strategy = 'quantile'【str】:分箱策略,決定如何劃分區間。
  • 若為 'uniform',將特徵值範圍等寬劃分(即每個 bin 的寬度相同)。
  • 對異常值敏感:若數據分佈偏斜,可能導致某些 bin 樣本極少甚至為空。
  • 若為 'quantile'(默認),按分位數劃分,使每個 bin 包含大致相等數量的樣本。
  • 更魯棒於偏態分佈;但若存在大量重複值,可能導致 bin 邊界重合。
  • 若為 'kmeans',使用一維 KMeans 聚類中心確定 bin 邊界,最小化 bin 內方差。
  • 能更好地適應數據局部密度,但計算開銷略高。
  • 注意:所有策略均在 fit 階段基於訓練數據計算 bin 邊界,transform 階段直接映射;測試集中的值若超出訓練範圍,會被分配到最近的 bin(不會報錯)。
  1. 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 需確保兼容性。
  1. subsample = 200_000【int | None】:用於 'quantile' 或 'kmeans' 策略時的採樣數量上限。
  • 為加速分位數或 KMeans 計算,當 n_samples > subsample 時,會隨機採樣子集進行 bin 邊界估計。
  • 若為 None,則使用全部樣本。
  • 默認 200,000 在精度與效率間取得平衡。
  • 注意:僅影響 fit 階段的計算速度,不影響最終 transform 的確定性(若 random_state 固定)。
  1. 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,合成少數類過採樣技術}

用途:用於解決分類任務中的類別不平衡問題。通過對少數類樣本在其近鄰之間插值,生成新的合成樣本,從而增加少數類的代表性,改善模型對少數類的識別能力。

參數

  1. sampling_strategy = 'auto'【float | str | dict | callable】:指定重採樣策略,控制目標類別比例。
  • 若為 'auto'(默認),對所有少數類進行過採樣,使其數量等於多數類(即 1:1)。
  • 若為 float(如 0.5),僅適用於二分類,表示少數類 / 多數類 的目標比例(必須 ∈ (0, 1])。
  • 若為 dict(如 {0: 200, 1: 300}),顯式指定每個類別的最終樣本數(僅對鍵中包含的類執行過採樣)。
  • 若為 callable,接收 y 值並返回目標採樣策略字典。
  • 注意:SMOTE 只對少數類進行過採樣,不會減少多數類;若需同時欠採樣,應結合如 SMOTETomek 等組合方法。
  1. random_state = None【int | RandomState | None】:控制隨機數生成器的種子。
  2. k_neighbors = 5【int | object】:用於為每個少數類樣本尋找近鄰的 KNN 參數。
  • 若為 int(默認 5),表示使用 k=5 的 KNeighborsClassifier 查找同類近鄰。
  • 若為 KNeighborsMixin 實例(如自定義的 NearestNeighbors 對象),則直接使用該對象進行近鄰搜索。
  • 注意:k_neighbors 必須小於少數類樣本數;若少數類樣本太少(如 <6),需減小該值,否則會報錯。
  1. 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)

用途:用於特徵選擇,通過移除低方差的特徵(即在所有樣本中幾乎不變的特徵)來簡化數據集。假設特徵值為數值型且已適當縮放,方差越小説明該特徵提供的信息越少。

參數

  1. 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 個特徵,適用於降維和提升模型效率。

參數説明

  1. 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)會導致異常。
  1. 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)特徵選擇方法,通過反覆訓練模型並剔除最不重要特徵,最終保留指定數量的最優特徵子集。適用於提升模型性能、降低過擬合風險和增強可解釋性。

參數説明

  1. estimator【object】:用於評估特徵重要性的基礎估計器(必須實現 fit 方法,並提供 coef_ 或 feature_importances_ 屬性)。
  • 常見選擇:LinearRegression、LogisticRegression、SVC(需設置 probability=True 或使用 kernel='linear' 以支持 coef_)、RandomForestClassifier 等。
  • 注意:若 estimator 不具備特徵權重屬性(如 KNeighborsClassifier),會報錯。
  1. n_features_to_select = None【int | float | None】:最終保留的特徵數量。
  • 若為 float(如 0.5),表示保留總特徵數的該比例(向下取整)。
  • 若為 None(默認),則保留總特徵數的一半(即 n_features // 2)。
  • 注意:必須滿足 1 ≤ n_features_to_select ≤ n_features。
  1. step = 1【int | float】:每輪迭代中剔除的特徵數量或比例。
  • 若為 float(如 0.1),每輪移除當前剩餘特徵的該比例(至少剔除1個)。
  • 較小的 step 提高精度但增加計算開銷;較大的 step 加速過程但可能跳過更優子集。
  • 注意:step 必須 > 0 且 < 當前特徵數。
  1. verbose = 0【int】:控制輸出日誌的詳細程度。
  • 0(默認):不輸出。
  • ≥1:顯示每輪消除的特徵數量等信息。
  • 注意:主要用於調試或監控長時間運行的特徵選擇過程。
  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,效率更高