機器學習 - P值



在機器學習中,我們使用 P 值來檢驗零假設,即兩個變數之間沒有顯著關係。例如,如果我們有一個房價資料集,並且想要確定房屋大小與其價格之間是否存在顯著關係,我們可以使用 P 值來檢驗這個假設。

為了理解機器學習中 P 值的概念,我們首先需要理解零假設和備擇假設的概念。零假設是假設兩個變數之間沒有顯著關係,而備擇假設則與零假設相反,它指出兩個變數之間存在顯著關係。

一旦我們定義了零假設和備擇假設,我們就可以使用 P 值來檢驗假設的顯著性。P 值是在零假設為真的前提下,獲得觀測結果或更極端結果的機率。

如果 P 值小於顯著性水平(通常設定為 0.05),那麼我們拒絕零假設並接受備擇假設。這意味著兩個變數之間存在顯著關係。另一方面,如果 P 值大於顯著性水平,那麼我們不拒絕零假設,並得出結論認為兩個變數之間沒有顯著關係。

Python 中 P 值的實現

Python 提供了幾個用於統計分析和假設檢驗的庫。最流行的統計分析庫之一是 scipy 庫。scipy 庫提供了一個名為 ttest_ind() 的函式,可用於計算兩個獨立樣本的 P 值。

為了演示機器學習中 p 值的實現,我們將使用 scikit-learn 提供的乳腺癌資料集。該資料集的目標是根據腫瘤的半徑、紋理、周長、面積、光滑度、緻密性、凹度和對稱性等各種特徵來預測乳腺腫瘤是惡性還是良性。

首先,我們將載入資料集並將其拆分為訓練集和測試集:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

data = load_breast_cancer()
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

接下來,我們將使用 scikit-learn 中的 SelectKBest 類根據它們的 p 值選擇前 k 個特徵。在這裡,我們將選擇前 5 個特徵:

from sklearn.feature_selection import SelectKBest, f_classif
k = 5
selector = SelectKBest(score_func=f_classif, k=k)
X_train_new = selector.fit_transform(X_train, y_train)
X_test_new = selector.transform(X_test)

SelectKBest 類採用評分函式作為輸入來計算每個特徵的 p 值。我們使用 f_classif 函式,它是每個特徵與目標變數之間的 ANOVA F 值。k 引數指定要選擇的頂級特徵的數量。

在訓練資料上擬合選擇器後,我們使用 fit_transform() 方法轉換資料以僅保留前 k 個特徵。我們還使用 transform() 方法轉換測試資料以僅保留選擇的特徵。

我們現在可以在選擇的特徵上訓練模型並評估其效能:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

model = LogisticRegression()
model.fit(X_train_new, y_train)
y_pred = model.predict(X_test_new)

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

在這個例子中,我們在前 5 個選擇的特徵上訓練了一個邏輯迴歸模型,並使用準確率評估了它的效能。但是,p 值也可以用於假設檢驗,以確定一個特徵是否具有統計學意義。

例如,要檢驗平均半徑特徵是否顯著的假設,我們可以使用 scipy.stats 模組中的 ttest_ind() 函式:

from scipy.stats import ttest_ind

malignant = X[y == 0, 0]
benign = X[y == 1, 0]
t, p_value = ttest_ind(malignant, benign)

print(f"P-value: {p_value:.2f}")

ttest_ind() 函式接收兩個陣列作為輸入,並返回 t 統計量和雙尾 p 值。

輸出

我們將從上述實現中獲得以下輸出:

Accuracy: 0.97
P-value: 0.00

在這個例子中,我們計算了惡性和良性類別之間平均半徑特徵的 p 值。

廣告