from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification# 生成示例分類數據
# n_samples: 樣本數量, n_features: 特征數量, n_classes: 類別數量
X, y = make_classification(n_samples=1000, # 1000個樣本n_features=20, # 20個特征n_classes=2, # 二分類問題random_state=42 # 隨機種子,保證結果可重現
)
print("示例數據:")
print(X, y)# 將數據分為訓練集和測試集
# test_size=0.2: 20%數據作為測試集,80%作為訓練集
# random_state=42: 固定隨機種子,確保每次分割結果相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42
)# 創建并訓練一個隨機森林分類器
# n_estimators: 樹的數量, random_state: 隨機種子
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train) # 使用訓練數據擬合模型# 分類模型評估
y_pred = model.predict(X_test) # 使用模型對測試集進行預測# 輸出分類報告:包含precision(精確率)、recall(召回率)、f1-score和support(支持數)
print("分類報告:")
print(classification_report(y_test, y_pred))# 輸出混淆矩陣:展示預測結果與實際結果的對比
print("混淆矩陣:\n", confusion_matrix(y_test, y_pred))
導入必要的庫:
classification_report
?和?confusion_matrix
?用于模型評估train_test_split
?用于分割訓練集和測試集RandomForestClassifier
?是我們使用的分類模型make_classification
?用于生成示例數據
生成示例數據:
- 使用?
make_classification
?生成 1000 個樣本,每個樣本有 20 個特征 - 這是一個二分類問題(n_classes=2)
random_state=42
?確保每次運行生成相同的數據,便于結果重現
- 使用?
分割數據集:
- 將數據分為訓練集(80%)和測試集(20%)
- 訓練集用于模型訓練,測試集用于評估模型性能
創建并訓練模型:
- 使用隨機森林分類器,包含 100 棵決策樹
fit
?方法用于訓練模型,接收訓練數據(X_train)和對應的標簽(y_train)
模型預測與評估:
model.predict(X_test)
?用訓練好的模型對測試集進行預測,得到預測標簽 y_predclassification_report
?計算并打印分類指標:- precision(精確率):預測為正的樣本中實際為正的比例
- recall(召回率):實際為正的樣本中被正確預測的比例
- f1-score:精確率和召回率的調和平均
- support:每個類別的實際樣本數量
accuracy(準確率)
- 含義:所有預測中正確預測的比例
- 計算公式:
(TP + TN) / (TP + TN + FP + FN)
- 解讀:直觀反映模型的整體正確率,但在類別不平衡時可能有誤導性(例如 99% 樣本是正類,模型全預測為正類也能達到 99% 準確率)
macro avg(宏平均)
- 含義:先計算每個類別的指標(精確率、召回率、F1 分數),再取簡單平均值(不考慮類別樣本數量)
- 特點:對所有類別一視同仁,無論每個類別的樣本數量多少
- 適用場景:希望平等關注每個類別(尤其是小樣本類別)的場景
weighted avg(加權平均)
- 含義:先計算每個類別的指標,再根據每個類別的樣本數量(support)進行加權平均
- 特點:樣本數量多的類別對結果影響更大
- 適用場景:類別不平衡時,更能反映模型在整體數據上的表現
總結:優先看?accuracy
?了解整體表現,類別不平衡時,weighted avg
?比?macro avg
?更有參考價值,關注小類別表現時,需重點看該類別的單獨指標而非宏平均
confusion_matrix
?展示混淆矩陣,直觀顯示各類別預測正確和錯誤的數量- TP(True Positive):真實為正例,預測也為正例(正確預測)
- FN(False Negative):真實為正例,預測為負例(漏檢)
- FP(False Positive):真實為負例,預測為正例(誤檢)
- TN(True Negative):真實為負例,預測也為負例(正確預測)
? ?總結:??從混淆矩陣中能獲取的關鍵信息:模型的錯誤類型是漏檢(FN)多還是誤檢(FP)多。類別預測的穩定性,若某一類別的對角線元素(TP/TN)占比低,說明模型對該類的預測效果差。