特徵工程(1)
阿新 • • 發佈:2019-02-08
最近在處理特徵,有點拙見,分享出來,歡迎各路神仙拍磚指正。
在此以 iris 資料集為例子來說明問題:
# 載入資料集到全域性環境
data(iris)
# 載入rpart來構建一顆決策樹
library(rpart)
my_tree <- rpart(Species~., data = iris)
# n= 150
#
# node), split, n, loss, yval, (yprob)
# * denotes terminal node
# 1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)
# 2) Petal.Length< 2.45 50 0 setosa (1.00000000 0.00000000 0.00000000) *
# 3) Petal.Length>=2.45 100 50 versicolor (0.00000000 0.50000000 0.50000000)
# 6) Petal.Width< 1.75 54 5 versicolor (0.00000000 0.90740741 0.09259259) *
# 7) Petal.Width>=1.75 46 1 virginica (0.00000000 0.02173913 0.97826087) *
將構建的樹打印出來,發現 Petal.Length 是樹的第一個劃分點,下面來驗證一下特徵的重要性
print(my_tree$variable.importance)
# Petal.Width Petal.Length Sepal.Length Sepal.Width
# 88.96940 81.34496 54.09606 36.01309
發現 Petal.Width 與 Petal.Length 特徵重要性得分相對都比較高,再看看這些特徵在相應分類變數(響應變數)下的資料分佈情況
# 載入繪圖包
library(ggplot2)
- Petal.Width
ggplot(data = iris) + geom_density(mapping = aes(x = Petal.Width, col = Species))
- Petal.Length
ggplot(data = iris) + geom_density(mapping = aes(x = Petal.Length, col = Species))
- Sepal.Length
ggplot(data = iris) + geom_density(mapping = aes(x = Sepal.Length, col = Species))
- Sepal.Width
ggplot(data = iris) + geom_density(mapping = aes(x = Sepal.Width , col = Species))
如圖示,可清晰的看到特徵得分較高的特徵在分類變數條件下資料分佈間的差異性較大,下面我們構造一個對分類變數劃分很明確的特徵,來看看效果。
iris2 <- cbind(iris, V = c(rnorm(50), runif(50, 2, 3), rpois(50, 10)))
my_tree2 <- rpart(Species~., data = iris2)
print(my_tree2$variable.importance)
# V Petal.Width Petal.Length Sepal.Length Sepal.Width
# 100 94 93 61 38
# 繪製資料分佈圖
ggplot(data = iris2) + geom_density(mapping = aes(x = V, col = Species))
構造的特徵資料分別來自三個不同分佈,這裡特徵重要性得分到達了滿分,說明了以該特徵為劃分,可以百分之百將分類變數劃分,當然這裡是在預先知道分類變數型別下有意去構造能劃分出分類變數的資料,以此特徵來進行預測必然會產生過擬合的現象。這裡只是為了說明特徵在分類變數下的資料分佈的差異是劃分特徵的一個重要原則。
這裡延伸一個觀點,不管什麼模型(這裡針對樹型模型),模型本身只識別資料,而資料的現實意義是我們人工賦予的,如果該具備現實意義的資料恰好符合模型做分類很好的劃分,那麼該具備現實意義的資料就成為模型的一個重要的特徵,比如男女的劃分,可以以頭髮長短來劃分,這裡可以劃分大部分,少部分也會被誤判,當然男女最好的劃分當然是生殖器,因為本身就是以這個特徵來定義男女的,這裡就相當於用響應變數來進行劃分,自然是百分之百區分。
現實環境中,特徵是隨著時間在不斷變化的,因此任何模型都有它的適用範圍,超出這個範圍自然會失去其中效用。