R 中的資料探勘演算法/降維/特徵選擇
在資料探勘中,特徵選擇是透過分析和理解資料集特徵對模型的影響來降低資料集維度的任務。例如,考慮一個預測模型C1A1 + C2A2 + C3A3 = S,其中Ci 是常數,Ai 是特徵,S 是預測器輸出。瞭解使用的特徵(A1,A2 和A3)的重要性以及它們與模型的相關性及其與S 的相關性很有意思。這種分析使我們能夠選擇原始特徵的一個子集,從而降低資料探勘過程未來步驟的維度和複雜性。在子集選擇過程中,我們嘗試識別並儘可能多地刪除不相關和冗餘的資訊。
特徵選擇技術可以分為兩種方法:特徵排序和子集選擇。在第一種方法中,特徵按某種標準進行排序,然後選擇高於定義閾值的特徵。在第二種方法中,人們在特徵子集空間中搜索最佳子集。此外,第二種方法可以分為三個部分
- 過濾器方法:您首先選擇特徵,然後使用此子集執行分類演算法;
- 嵌入式方法特徵選擇作為分類演算法的一部分進行;
- 包裝方法為了識別最佳特徵,將分類演算法應用於資料集。
R 的 FSelector 包提供了用於過濾屬性(例如 cfs、卡方、資訊增益、線性相關性)的演算法,以及用於包裝分類器和搜尋屬性子集空間的演算法(例如最佳優先搜尋、後向搜尋、前向搜尋、爬山搜尋)。該包還使得能夠透過執行不同的截止方式,根據屬性權重選擇特徵子集。
FSelector 包由 Piotr Romanski 建立,本文基於 2009 年 4 月 11 日釋出的 0.16 版本。
正如我們解釋的那樣,在排序方法中,特徵按某種標準進行排序,然後選擇那些高於定義閾值的特徵。對於這種方法,可以考慮一個通用演算法,您只需要決定要使用哪種最佳排序標準。在 F-Selector 包中,這種標準由一組函式表示,這些函式根據模型為您的特徵計算權重。所有這些元素將在本文中進行解釋。
特徵排序方法的通用演算法是
for each feature F_i
wf_i = getFeatureWeight(F_i)
add wf_i to weight_list
sort weight_list
choose top-k features
我們可以透過以下命令將這種演算法思想轉換為 R 語言
#load a dataset and use it as the main source of data
library(mlbench)
data(HouseVotes84)
#calculate weights for each attribute using some function
weights <- '''SOME_FUNCTION'''(Class~., HouseVotes84)
print(weights)
#select a subset of 5 features with the lowest weight
subset <- cutoff.k(weights, 5)
#print the results
f <- as.simple.formula(subset, "Class")
print(f)
在上面的程式碼的第一部分,我們使用函式library 載入包mlbench,它包含一系列人工和現實世界的機器學習基準問題,包括,例如,來自 UCI 儲存庫的幾個資料集。(http://cran.r-project.org/web/packages/mlbench/index.html)。之後,我們使用mlbench 資料集HouseVotes84(1984 年美國眾議院投票記錄)作為後續步驟的工作資料來源。您也可以定義自己的資料集並將其提供為演算法的輸入,而不是使用HouseVotes84。
HouseVotes84 資料集包括美國眾議院議員在 CQA 識別的 16 個關鍵投票中對每個投票的投票。CQA 包含 16 個變數,並考慮了由三種類別表示的九種不同型別的投票:同意(投票贊成、配對贊成、宣佈贊成)、反對(投票反對、配對反對、宣佈反對)和未知(投票出席、投票出席以避免利益衝突、未投票或未表明立場)。
在上面的程式碼的第二部分,我們使用某個函式計算每個屬性的權重。該函式必須由使用者選擇,這些函式將在本文後面列出。這些函式的輸出將是一個包含特徵及其權重的列表,這些權重是根據所選技術確定的,並將儲存在weights 陣列中。您可以像使用命令print 一樣列印權重。
在上面的程式碼的第三部分,我們定義了weights 陣列中前 5 個特徵的截止值。透過使用函式cutoff.k,我們告知陣列名稱和k 值,在本例中為 5。結果將儲存在另一個名為subset 的陣列中,該陣列包含排名前 5 的特徵及其權重。
在上面的程式碼的第四部分,您可以將最終模型列印為一個簡單的公式,該公式由subset 陣列中存在的特徵子集和可預測的特徵名稱Class 組成。
以下列出的所有技術都可以用來生成特徵的排名權重。第一個引數formula 是模型的符號描述(例如 Class~。對於所有特徵都被用來預測特徵Class 的模型)。第二個引數data 是模型要考慮的目標資料。
用法
chi.squared(formula, data)
皮爾遜相關性的用法
linear.correlation(formula, data)
斯皮爾曼相關性的用法
rank.correlation(formula, data)
資訊增益的用法
information.gain(formula, data)
增益比的用法
gain.ratio(formula, data)
對稱不確定性的用法
symmetrical.uncertainty(formula, data)
用法
oneR(formula, data)
用法
random.forest.importance(formula, data, importance.type = 1)
其中importance.type引數指定重要性度量的型別 (1=平均準確率下降,2=平均節點純度下降)。
在特徵子集選擇方法中,人們會搜尋特徵子集空間以找到最優子集。這種方法存在於 FSelector 包中,透過包裝技術 (例如,最佳優先搜尋、後退搜尋、前進搜尋、爬山搜尋) 來實現。這些技術透過告知一個函式來工作,該函式接收一個子集併為該子集生成一個評估值。在子集空間中執行搜尋,直到找到最佳解決方案。
特徵子集選擇方法的通用演算法是
S = all subsets
for each subset s in S
evaluate(s)
return (the best subset)
我們可以透過使用以下命令將演算法思想翻譯成 R 程式碼
#load a dataset and use it as the main source of data
library(mlbench)
data(HouseVotes84)
#define the evaluation function
evaluator <- function(subset) {
#here you must define a function that returns a double value to evaluate the given subset
#consider high values for good evaluation and low values for bad evaluation.
return(something)
}
#perform the best subset search
subset <- MY_FUNCTION(data, evaluator)
#prints the result
f <- as.simple.formula(subset, "Class")
print(f)
與本文第一個示例一樣,我們再次使用 mlbench 庫中的 HouseVotes84 資料集。我們必須定義一個評估函式,該函式將在給定子集上進行一些計算,併為好的子集返回一個高值。之後,您只需要選擇一種搜尋策略,並且還可以列印選擇結果。
FSelector 包提供了一些函式來搜尋最佳子集選擇。在大多數情況下,attributes 引數是一個包含所有要搜尋的屬性的字元向量 (在搜尋過程中將被劃分為子集的特徵集),而eval.fun 引數是一個函式,它將包含所有屬性的字元向量作為第一個引數,並返回一個數值,指示給定子集的重要性。CFS 和一致性技術透過使用最佳優先方法封裝了此過程,因此您只需要像在排名方法中一樣告知符號模型和資料。
用法
best.first.search(attributes, eval.fun)
用法
exhaustive.search(attributes, eval.fun)
前向貪婪搜尋用法
forward.search(attributes, eval.fun)
後向貪婪搜尋用法
backward.search(attributes, eval.fun)
用法
hill.climbing.search(attributes, eval.fun)
用法
cfs(formula, data)
用法
consistency(formula, data)