機器學習中用於特徵選擇的卡方檢驗
特徵選擇是機器學習的一個重要方面。它涉及從大量可用特徵中選擇一個子集,以提高模型的效能。特徵選擇很重要,因為它可以幫助降低模型的複雜性,提高模型的準確性,並使模型更易於解釋。
一種常見的特徵選擇方法是卡方檢驗。本教程將解釋什麼是卡方檢驗,它是如何用於特徵選擇的,以及卡方特徵選擇的Python實現。
什麼是卡方檢驗?
卡方檢驗是一種統計檢驗,用於確定兩個分類變數之間是否存在顯著關聯。它基於卡方分佈,這是一種描述平方標準正態偏差之和的分佈的機率分佈。
卡方檢驗用於檢驗兩個分類變數之間沒有關聯的原假設。如果檢驗產生的p值小於預定的顯著性水平,則拒絕原假設,並得出結論認為這兩個變數之間存在顯著關聯。
卡方檢驗如何用於特徵選擇?
在機器學習中,卡方檢驗常用於特徵選擇。特徵選擇的目的是選擇與預測任務最相關的特徵子集。卡方檢驗可以用來確定每個特徵與目標變數之間是否存在顯著關聯。與目標變數高度相關的特徵更有可能對預測有用,而與目標變數無關的特徵則不太可能對預測有用。
卡方檢驗通常是在列聯表上進行的。列聯表是一個顯示分類變數在兩個或多個組中的分佈的表。在特徵選擇的背景下,列聯表是透過計算每個特徵在目標變數的每個類別中出現的次數來構建的。然後使用列聯表計算卡方統計量和p值。
卡方統計量的計算公式如下:
$$\mathrm{X^{2}\:=\:\Sigma\:(O_{i}\:-\:E_{i})^{2}\:/\:E_{i}}$$
其中𝑂𝑖是列聯表中第i個單元格的觀察頻數,𝐸𝑖是列聯表中第i個單元格的期望頻數。期望頻數是透過將第i個單元格的行總計和列總計相乘,然後除以總計來計算的。
卡方統計量衡量列聯表中每個單元格的觀察頻數與期望頻數之間的差異。如果卡方統計量很大,則表明特徵與目標變數之間存在顯著關聯。
p值根據卡方統計量和自由度計算得出。列聯表的自由度計算公式為(r-1)(c-1),其中r是列聯表的行數,c是列聯表的列數。p值表示在原假設為真的情況下,觀察到與觀察到的卡方統計量一樣極端的卡方統計量的機率。如果p值小於顯著性水平,則拒絕原假設,並得出結論認為特徵與目標變數之間存在顯著關聯。
示例
為了說明如何使用卡方檢驗進行特徵選擇,讓我們考慮一個簡單的例子。假設我們有一個包含患者的資料集,其二元分類任務是他們是否患有某種特定疾病。我們還有四個分類特徵:年齡(40歲以下、40-60歲、60歲以上)、性別(男性、女性)、吸菸狀況(從未吸菸、目前吸菸或曾經吸菸)和家族病史(陽性、陰性)。我們想要確定哪些特徵與預測疾病狀態最相關。
我們首先構建一個列聯表,該表顯示每個特徵在目標變數的兩個類別(疾病狀態)中的分佈。
患病 | 未患病 | |
---|---|---|
年齡 | 0-40 20 | 80 |
40-60 30 | 70 | |
>60 40 | 60 | |
性別 | 男性 30 | 70 |
女性 60 | 40 | |
吸菸 | 從未吸菸 50 | 50 |
目前吸菸 20 | 80 | |
曾經吸菸 40 | 60 | |
家族病史 | 陽性 40 | 60 |
陰性 30 | 70 |
然後,我們可以使用前面提到的公式計算每個特徵的卡方統計量和p值。
Age: Chi-Square = 15.67, p-value = 0.0004 Gender: Chi-Square = 24.5, p-value = 7.5e-07 Smoking: Chi-Square = 8.33, p-value = 0.0159 Family: Chi-Square = 2.5, p-value = 0.1131
從結果中,我們可以看到性別具有最高的卡方統計量和最低的p值,這表明它是預測疾病狀態最相關的特徵。年齡和吸菸狀況也與疾病狀態存在顯著關聯,而家族病史則沒有。因此,我們可以選擇年齡、性別和吸菸狀況作為我們的預測任務的特徵。
卡方特徵選擇的Python實現
現在讓我們討論如何在Python中執行卡方特徵選擇。我們將使用scikit-learn庫,該庫提供了一個名為SelectKBest的函式,用於根據給定的評分函式選擇k個最佳特徵。在本例中,評分函式將是卡方檢驗。
首先,讓我們載入資料集並將其拆分為訓練集和測試集:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # Load the dataset data = load_iris() # Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=0)
接下來,我們需要從sklearn.feature_selection模組匯入SelectKBest類和chi2函式:
from sklearn.feature_selection import SelectKBest, chi2
然後,我們可以例項化SelectKBest類並指定要選擇的特徵數量。在這個例子中,我們將選擇前兩個特徵:
# Instantiate the SelectKBest class selector = SelectKBest(score_func=chi2, k=2) # Fit the selector to the training data selector.fit(X_train, y_train)
然後,我們可以使用transform方法將訓練集和測試集轉換為僅包含所選特徵:
# Transform the training and testing sets X_train_selected = selector.transform(X_train) X_test_selected = selector.transform(X_test)
最後,我們可以在所選特徵上訓練模型並在測試集上評估其效能:
from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # Train a logistic regression model on the selected features clf = LogisticRegression() clf.fit(X_train_selected, y_train) # Evaluate the performance of the model on the testing set y_pred = clf.predict(X_test_selected) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy}")
輸出
以下是其輸出:
Accuracy: 0.9777777777777777
我們進行了卡方特徵選擇,並在所選特徵上訓練了一個模型。請注意,這只是如何在Python中執行卡方特徵選擇的一個示例,根據專案的具體要求,還有許多其他方法可以實現它。
結論
總之,卡方檢驗是一種強大且廣泛使用的機器學習特徵選擇方法。它能夠識別出與預測目標變數最相關的特徵,從而有助於降低模型的複雜性,提高模型的準確性並增強模型的可解釋性。
在本教程中,我們詳細討論了卡方檢驗,包括其數學基礎、在特徵選擇中的應用以及使用scikit-learn庫的Python實現。