在機器學習和數據分析中,「標籤」(Label)通常指的是你想要預測的目標變數,這個變數代表了你模型的輸出結果。「標籤欄位不平衡」指的是在分類問題中,目標變數(即標籤或類別)不同類別的樣本數量分佈不均勻,某些類別的樣本數遠多於其他類別的樣本數。
# 可使用目錄功能快速確認要閱覽的主題
假設我們有一個紅酒品質預測的數據集,標籤欄位 quality
的值範圍是3到8,代表不同品質的紅酒。如果數據集中的品質標籤分佈如下:
quality = 5
:6000樣本quality = 6
:5000樣本quality = 7
:400樣本quality = 8
:100樣本quality = 4
:50樣本quality = 3
:10樣本這裡我們看到 quality = 5
和 quality = 6
的樣本數遠遠多於其他品質等級的紅酒,這就是標籤不平衡的情況。
標籤不平衡會對模型的訓練、評估和最終預測性能產生多種不利影響:
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 創建一個不平衡的數據集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10,
n_clusters_per_class=1, weights=[0.9, 0.1], flip_y=0, random_state=42)
# 分割數據集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用 SMOTE 進行過採樣
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X_train, y_train)
# 訓練隨機森林模型
model = RandomForestClassifier(random_state=42)
model.fit(X_resampled, y_resampled)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 顯示分類報告
print(classification_report(y_test, y_pred))
使用 SMOTE(Synthetic Minority Over-sampling Technique)
from imblearn.under_sampling import RandomUnderSampler
# 使用 RandomUnderSampler 進行欠採樣
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)
# 訓練隨機森林模型
model = RandomForestClassifier(random_state=42)
model.fit(X_resampled, y_resampled)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 顯示分類報告
print(classification_report(y_test, y_pred))
使用 RandomUnderSampler
class_weight
參數來自動調整類別權重。# 訓練帶有類別權重的隨機森林模型
model = RandomForestClassifier(class_weight='balanced', random_state=42)
model.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 顯示分類報告
print(classification_report(y_test, y_pred))
在模型中使用 class_weight='balanced'
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 創建一個不平衡的數據集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10,
n_clusters_per_class=1, weights=[0.9, 0.1], flip_y=0, random_state=42)
# 分割數據集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用 SMOTE 進行過採樣
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X_train, y_train)
# 訓練隨機森林模型
model = RandomForestClassifier(random_state=42)
model.fit(X_resampled, y_resampled)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 顯示分類報告
print(classification_report(y_test, y_pred))
使用 SMOTE 或 ADASYN
使用範例:
【資料分析】python機器學習-使用不同的方法來評估模型準確率
from sklearn.metrics import precision_recall_curve
# 獲取預測概率
y_scores = model.predict_proba(X_test)[:, 1]
# 計算精確率、召回率及其對應的閾值
precisions, recalls, thresholds = precision_recall_curve(y_test, y_scores)
# 找到最佳的閾值
f1_scores = 2 * (precisions * recalls) / (precisions + recalls)
optimal_threshold = thresholds[np.argmax(f1_scores)]
print(f"Optimal Threshold: {optimal_threshold}")
# 根據最佳閾值進行預測
y_pred_new = (y_scores >= optimal_threshold).astype(int)
# 顯示新的分類報告
print(classification_report(y_test, y_pred_new))
通過調整閾值來改進模型對少數類別的預測
from xgboost import XGBClassifier
# 訓練 XGBoost 模型並設置類別權重
model = XGBClassifier(scale_pos_weight=len(y_train[y_train == 0]) / len(y_train[y_train == 1]), random_state=42)
model.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 顯示分類報告
print(classification_report(y_test, y_pred))
使用隨機森林或 XGBoost 等集成學習方法