Julia機器學習 ---- 使用ScikitLearn.jl做特徵選擇

1、爲什麼要特徵選擇

特徵選擇也叫特徵子集選bai擇 ( FSS , Feature Subset Selection ) 。是指從已有的M個特徵(Feature)中選擇N個特徵使得系統的特定指標最優化。這麼做的理由如下:

一是可以緩解維數災難,你的機器學習算法的上限,就是你放入的特徵

二是降低學習任務的難度,需要尋求儘量少的特徵,但是卻能真正把握數據的趨勢和模式

三是可以增強一點可解釋性,不相關的特徵就是噪聲。

 

2、怎麼做

特徵選擇的方式有很多比如:過濾式,包裹式,嵌入式。但是很多時候憑藉人的直覺就可以去掉一些無關的特徵。

1、Filter方法
      其主要思想是:對每一維的特徵“打分”,即給每一維的特徵賦予權重,這樣的權重就代表着該維特徵的重要性,然後依據權重排序。

      主要的方法有:Chi-squared test(卡方檢驗),ID3(信息增益),correlation coefficient scores(相關係數)

2、Wrapper方法:
      其主要思想是:將子集的選擇看作是一個搜索尋優問題,生成不同的組合,對組合進行評價,再與其他的組合進行比較。這樣就將子集的選擇看作是一個是一個優化問題,這裏有很多的優化算法可以解決,尤其是一些啓發式的優化算法,如GA,PSO,DE,ABC等,詳見“優化算法——人工蜂羣算法(ABC)”,“優化算法——粒子羣算法(PSO)”。

      主要方法有:recursive feature elimination algorithm(遞歸特徵消除算法)

3、Embedded方法
      其主要思想是:在模型既定的情況下學習出對提高模型準確性最好的屬性。這句話並不是很好理解,其實是講在確定模型的過程中,挑選出那些對模型的訓練有重要意義的屬性。

      主要方法:正則化。如嶺迴歸就是在基本線性迴歸的過程中加入了正則項。

 

3、怎麼用

這裏沒有嚴格按照上面的分類給出響應的代碼示例。但是會把scikit-learn中提到的一些方法,用Julia代碼給出示例。

python代碼可以參考:Feature selection

3.1 通過方差過濾(一種Filter方法)

VarianceThreshold是一種簡單的特徵選擇基線方法。它刪除了方差不滿足某個閾值的所有特徵。默認情況下,它會刪除所有零方差特徵,即在所有樣本中具有相同值的特徵

using LinearAlgebra
using DataFrames,CSV
using Statistics
using ScikitLearn
@sk_import feature_selection: VarianceThreshold

houses = DataFrame(CSV.File(joinpath(dirname(pathof(DataFrames)),"D:/houses.csv")));
feature = Matrix(houses[:, [:beds,:baths,:sq__ft,:price,:latitude,:longitude]])
#設置閾值,也就是會過濾方差<.8 * (1 - .8)
sel = VarianceThreshold(threshold=.8 * (1 - .8))
mapper = fit!(sel,feature)
#很明顯過濾了兩個不太相關的特徵
fit_transform!(mapper, copy(feature))
# 985×4 Array{Float64,2}:
#  2.0  1.0   836.0   59222.0
#  3.0  1.0  1167.0   68212.0
#  2.0  1.0   796.0   68880.0
#  2.0  1.0   852.0   69307.0
#  2.0  1.0   797.0   81900.0
#  3.0  1.0  1122.0   89921.0
#  3.0  2.0  1104.0   90895.0

3.2單變量特徵選擇(卡方檢驗)

using LinearAlgebra
using DataFrames,CSV
using Statistics
using ScikitLearn
@sk_import feature_selection: SelectPercentile
@sk_import feature_selection: SelectKBest
#卡方檢驗是假設檢驗的一種,用於分析兩個類別變量的相關關係
@sk_import feature_selection: chi2
@sk_import datasets: load_boston

houses = DataFrame(CSV.File(joinpath(dirname(pathof(DataFrames)),"D:/houses.csv")));
feature = Matrix(houses[:, [:beds,:baths,:sq__ft,:price,:latitude,:longitude]])
#負值轉爲正值
feature[:,6] = feature[:,6]*-1
X = feature
y = feature[:,4]
#設置要選擇的特徵維度
#這個地方要注意的是因變量Y 必須爲整數,不能爲浮點數。
selector  = SelectKBest(chi2, k=3)
fit_transform!(selector, X,y)

#使用百分比
X,y = load_boston(return_X_y=true)
y = [round(y[i])  for i in 1:length(y)]
selector  = SelectPercentile(chi2, percentile=50)
fit_transform!(selector, X,y)

3.3 遞歸特徵消除(SVC)

SVM簡介

支持向量機(support vector machines, SVM)是一種二分類模型,它的基本模型是定義在特徵空間上的間隔最大的線性分類器,間隔最大使它有別於感知機;SVM還包括核技巧,這使它成爲實質上的非線性分類器。SVM的的學習策略就是間隔最大化,可形式化爲一個求解凸二次規劃的問題,也等價於正則化的合頁損失函數的最小化問題。SVM的的學習算法就是求解凸二次規劃的最優化算法。

SVC和SVR

support vector classify(SVC)支持分類機做二分類的,找出分類面,解決分類問題

support vector regression(SCR)支持迴歸機做曲線擬合、函數迴歸 ,做預測,溫度,天氣,股票

代碼示例:

using LinearAlgebra
using DataFrames,CSV
using Statistics
using ScikitLearn
using PyCall
using Colors
using PyPlot
import PyPlot:plot
@sk_import feature_selection: RFE
@sk_import svm: SVC
@sk_import datasets: load_digits
@pyimport numpy as pynumpy

digits = load_digits()
X = digits["images"]
y = digits["target"]

# julia reshape和 Python 中 numpy.reshape的用法還是有區別的,只能用下面的方式 模擬numpy.reshape算法
# X = pynumpy.reshape(digits["images"],(length(digits["images"][:,1,1]), -1))
vector_2D = [X[i,:,:] for i in 1:length(X[:,1,1]) ]
X = convert(Array{Float64,2},X)

#SVM簡介
#支持向量機(support vector machines, SVM)是一種二分類模型,它的基本模型是定義在特徵空間上的間隔最大的線性分類器,間隔最大使它有別於感知機;SVM還包括核技巧,這使它成爲實質上的非線性分類器。SVM的的學習策略就是間隔最大化,可形式化爲一個求解凸二次規劃的問題,也等價於正則化的合頁損失函數的最小化問題。SVM的的學習算法就是求解凸二次規劃的最優化算法。
#對SVC和SVR的理解
#support vector classify(SVC)支持分類機做二分類的,找出分類面,解決分類問題
#support vector regression(SCR)支持迴歸機做曲線擬合、函數迴歸 ,做預測,溫度,天氣,股票
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
mapper = fit!(rfe, X, y)

# 最終的矩陣
#fit_transform!(mapper,X, y)

#這裏畢竟處理的是圖像,嘗試畫一下圖吧
ranking = pynumpy.reshape(rfe.ranking_,pynumpy.shape(images[1,:,:]))

# Plot pixel ranking
PyPlot.matshow(ranking, cmap=PyPlot.cm.Blues)
PyPlot.colorbar()
PyPlot.title("Ranking of pixels with RFE")
PyPlot.show()

 

畫圖:

 

 

3.4 使用SelectFromModel選擇功能

待補充.......

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章