一、數據集模塊 ( 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 內置數據集
|
數據集名稱
|
任務類型
|
説明
|
|
|
二分類
|
乳腺癌威斯康星州數據集
|
|
|
多分類
|
鳶尾花數據集
|
|
|
多分類
|
葡萄酒識別數據集
|
|
|
多分類
|
手寫數字圖像數據 (0-9,8×8像素)
|
|
|
多輸出迴歸
|
Linnerud數據集
|
|
|
迴歸
|
糖尿病數據集
|
|
|
迴歸
|
加州房價數據集
|
|
|
分類
|
森林覆蓋類型數據集 (大型)
|
|
|
文本分類
|
20類新聞組文本數據
|
|
|
文本分類
|
已TF-IDF向量化的20newsgroups數據
|
|
|
KDD Cup 1999 網絡入侵檢測數據集
|
|
|
|
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')
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
object
|
已訓練或待訓練的估計器
|
|
|
str/float/None
|
選擇閾值:'median', 'mean', 或具體數值
|
|
|
bool (False)
|
estimator是否已預先擬合
|
|
|
int (1)
|
多維繫數時的範數階數
|
|
|
int/None
|
最多保留的特徵數量
|
|
|
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 文本特徵提取
|
類名
|
用途
|
|
|
詞頻統計
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
int (5)
|
鄰居數量k
|
|
|
str/callable ('uniform')
|
權重策略:'uniform', 'distance', 或自定義函數
|
|
|
str ('auto')
|
計算算法:'auto', 'ball_tree', 'kd_tree', 'brute'
|
|
|
int (30)
|
樹算法葉節點大小
|
|
|
int (2)
|
Minkowski距離冪參數 (p=1曼哈頓, p=2歐氏)
|
|
|
str/callable ('minkowski')
|
距離度量方式
|
|
|
dict/None
|
距離函數額外參數
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
bool (True)
|
是否計算截距項
|
|
|
bool (True)
|
是否複製輸入數據X
|
|
|
int/None
|
並行任務數 (僅多輸出迴歸有效)
|
|
|
bool (False)
|
是否強制係數為非負值
|
4.2.2 正則化線性迴歸
|
類名
|
正則化類型
|
特點
|
|
|
L2
|
嶺迴歸,保持所有特徵
|
|
|
L1
|
產生稀疏解,特徵選擇
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
str ('l2')
|
正則化類型:'l1', 'l2', 'elasticnet', 'none'
|
|
|
bool (False)
|
是否使用對偶形式 (僅penalty='l2'且solver='liblinear')
|
|
|
float (1e-4)
|
收斂容忍度
|
|
|
float (1.0)
|
正則化強度的倒數 (C越大,正則化越弱)
|
|
|
bool (True)
|
是否計算截距項
|
|
|
float (1.0)
|
截距縮放因子 (僅solver='liblinear')
|
|
|
dict/str/None
|
類別權重:'balanced'或自定義字典
|
|
|
str ('lbfgs')
|
優化算法:'lbfgs', 'liblinear', 'newton-cg', 'sag', 'saga'
|
|
|
int (100)
|
最大迭代次數
|
|
|
str ('auto')
|
多分類策略:'ovr', 'multinomial', 'auto'
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
str ('squared_error')
|
損失函數類型
|
|
|
str ('l2')
|
正則化類型
|
|
|
float (0.0001)
|
正則化強度 (≥0)
|
|
|
float (0.15)
|
Elastic-Net中L1比例
|
|
|
int (1000)
|
最大迭代次數
|
|
|
str ('invscaling')
|
學習率策略:'constant', 'optimal', 'invscaling', 'adaptive'
|
|
|
float (0.01)
|
初始學習率
|
|
|
bool (False)
|
是否啓用早停
|
|
|
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)
關鍵參數
|
參數
|
説明
|
|
|
懲罰參數,控制誤分類的懲罰程度
|
|
|
核函數:'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'
|
|
|
核係數,對'rbf', 'poly', 'sigmoid'有效
|
|
|
是否啓用概率估計 (需訓練較慢的Platt scaling)
|
|
|
多分類策略:'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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
str ('gini')
|
分割標準:'gini', 'log_loss'
|
|
|
str ('best')
|
分割策略:'best'(最優), 'random'(隨機)
|
|
|
int/None
|
最大樹深度
|
|
|
int/float (2)
|
內部節點分裂最小樣本數
|
|
|
int/float (1)
|
葉節點最小樣本數
|
|
|
int/float/str/None
|
分割時考慮的特徵數:'sqrt', 'log2'
|
|
|
dict/str/None
|
類別權重,處理不平衡數據
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
int (100)
|
森林中決策樹數量
|
|
|
bool (True)
|
是否使用自助採樣構建每棵樹
|
|
|
bool (False)
|
是否計算袋外樣本評估
|
|
|
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')
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
int (8)
|
簇數量k
|
|
|
str/ArrayLike ('k-means++')
|
初始化方法:'k-means++', 'random'
|
|
|
int/str ('auto')
|
運行次數,取最優結果
|
|
|
int (300)
|
單次運行最大迭代次數
|
|
|
float (1e-4)
|
收斂容忍度
|
|
|
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 分類評估
|
函數
|
用途
|
|
|
準確率
|
|
|
F1分數 (綜合精確率和召回率)
|
|
|
召回率 (查全率)
|
|
|
精確率 (查準率)
|
|
|
混淆矩陣
|
|
|
分類報告 (包含多個指標)
|
|
|
ROC曲線
|
|
|
ROC AUC分數
|
|
|
精確率-召回率曲線
|
|
|
計算曲線下的面積
|
6..2 迴歸評估
|
函數
|
用途
|
|
|
均方誤差 (MSE)
|
|
|
平均絕對誤差 (MAE)
|
|
|
R²分數 (決定係數)
|
注意:np.sqrt(mse) 可得RMSE
6.1.3 聚類評估
|
函數
|
是否需要真實標籤
|
説明
|
|
|
否
|
輪廓係數 (評估簇內緊密度和簇間分離度)
|
|
|
否
|
Davies-Bouldin指數 (值越小越好)
|
|
|
否
|
Calinski-Harabasz指數 (值越大越好)
|
|
|
是
|
調整蘭德指數
|
|
|
是
|
歸一化互信息
|
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 交叉驗證策略
|
類名
|
用途
|
|
|
K折交叉驗證
|
|
|
分層K折,保持類別比例
|
|
|
時間序列交叉驗證 (不打亂)
|
|
|
交叉驗證評估模型
|
|
|
多指標交叉驗證
|
6.2.3 超參數調優
網格搜索 (GridSearchCV)
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None,
refit=True, cv=None, verbose=0)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
object
|
待調優的估計器
|
|
|
dict/list[dict]
|
超參數網格
|
|
|
str/callable/list/dict/None
|
評估指標
|
|
|
bool/str (True)
|
是否用最佳參數重新訓練
|
|
|
int/iterable/CV splitter
|
交叉驗證策略
|
|
|
int/None
|
並行任務數
|
|
|
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
list[tuple[str, object]]
|
步驟序列:[(name, transformer/estimator)]
|
|
|
str/object/None
|
啓用緩存以加速重複計算
|
|
|
bool (False)
|
是否打印執行日誌
|
關鍵特性:
- 繼承最後一個元素的estimator的所有屬性和方法
- 參數設置:
pipe.set_params(步驟名__參數=值) - 避免數據泄露,確保訓練/測試處理一致性
7.2 缺失值處理 (impute)
|
類名
|
參數
|
説明
|
|
|
|
簡單填充:mean, median, most_frequent, constant
|
|
|
|
KNN近鄰填充
|
7.3 多任務學習 (multioutput)
|
類名
|
用途
|
|
|
多標籤分類
|
|
|
多輸出迴歸
|
八、統計與可視化
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)
參數説明
|
參數
|
類型/默認值
|
説明
|
|
|
object
|
已訓練的分類器
|
|
|
array-like
|
原始特徵數據 (用於確定繪圖範圍)
|
|
|
list[int] ([0,1])
|
用於繪製的兩個特徵索引
|
|
|
int (100)
|
網格分辨率
|
|
|
str ('auto')
|
預測方式:'auto', 'predict', 'decision_function', 'predict_proba'
|
|
|
str ('contourf')
|
繪圖方法:'contourf', 'pcolormesh'
|
|
|
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,效率更高