?
一.特征選擇-單變量特征選擇
1.SelectKBest可以依據相關性對特征進行選擇,保留k個評分最高的特征。
方差分析
分類問題使用f_classif,回歸問題使用f_regression。
f_classif:分類任務
跟目標的分類,將樣本劃分成n個子集,S1,S2,..,Sn,我們希望每個子集的均值μ1,μ2,...,μn不相等。
我們假設H0:μ1=μ2=...=μn,當然我們希望拒絕H0,所以我們希望構造出來f最大越好。所以我們可以通過第i個特征xi對分類進行預測。f值越大,預測值越好。
f_regression:回歸任務
引用參考:https://blog.csdn.net/jetFlow/article/details/78884619
要計算f_regression中的ff值,我們首先要計算的是,這個就是i號特征和因變量y之間的樣本相關系數。
我們計算的?,才是f_regression中的ff值,服從F(1,n?2)F(1,n?2)分布。
ff值越大,i號特征和因變量y之間的相關性就越大,據此我們做特征選擇。
?
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
from sklearn.datasets import load_iris
# 特征選擇
data = load_iris()
slectKBest = SelectKBest(f_classif,k=2)
dataK = slectKBest.fit_transform(data.data,data.target)
2.基于學習模型的特征排序
針對每個單獨的特征和響應變量建立預測模型。其實Pearson相關系數等價于線性回歸里的標準化回歸系數。假如某個特征和響應變量之間的關系是非線性的,可以用基于樹的方法(決策樹、隨機森林)、或者擴展的線性模型等。基于樹的方法比較易于使用,因為他們對非線性關系的建模比較好,并且不需要太多的調試。但要注意過擬合問題,因此樹的深度最好不要太大,再就是運用交叉驗證
在波士頓房價數據集使用sklearn的隨機森林回歸給出一個單變量選擇的例子:
from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
cv=ShuffleSplit(len(X), 3, .3))
scores.append((round(np.mean(score), 3), names[i]))
print sorted(scores, reverse=True)
結果:
[(0.636, ‘LSTAT’), (0.59, ‘RM’), (0.472, ‘NOX’), (0.369, ‘INDUS’), (0.311, ‘PTRATIO’), (0.24, ‘TAX’), (0.24, ‘CRIM’), (0.185, ‘RAD’), (0.16, ‘ZN’), (0.087, ‘B’), (0.062, ‘DIS’), (0.036, ‘CHAS’), (0.027, ‘AGE’)]
二. 遞歸特征消除(RFE)
遞歸特征消除(Recursive feature elimination)
遞歸特征消除的主要思想是反復構建模型,然后選出最好的(或者最差的)特征(根據系數來選),把選出來的特征放到一邊,然后在剩余的特征上重復這個過程,直到遍歷了所有的特征。在這個過程中被消除的次序就是特征的排序。
RFE的穩定性很大程度上取決于迭代時,底層用的哪種模型。比如RFE采用的是普通的回歸(LR),沒有經過正則化的回歸是不穩定的,那么RFE就是不穩定的。假如采用的是Lasso/Ridge,正則化的回歸是穩定的,那么RFE就是穩定的。
下面的示例使用RFE和logistic回歸算法來選出前三個特征。算法的選擇并不重要,只需要熟練并且一致:
Import the required packages
Import pandas to read csv
Import numpy for array related operations
Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE
Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression
#URL for loading the dataset
url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia?betes/pima-indians-diabetes.data"
#Define the attribute names
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
#Create pandas data frame by loading the data from URL
dataframe = pandas.read_csv(url, names=names)
#Create array from data values
array = dataframe.values
#Split the data into input and target
X?=?array[:,:8]
Y?=?array[:,8]
#Feature extraction
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Num?Features:?%d"%?fit.n_features_)?
print("Selected?Features:?%s"%?fit.support_)
print("Feature?Ranking:?%s"%?fit.ranking_)
3.主成分分析
原理參考:https://blog.csdn.net/program_developer/article/details/80632779
PCA python 代碼實現:
#Python實現PCA
import numpy as np
def pca(X,k):#k is the components you want
#mean of each feature
n_samples, n_features = X.shape
mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
#normalization
norm_X=X-mean
#scatter matrix
scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
#Calculate the eigenvectors and eigenvalues
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
# sort eig_vec based on eig_val from highest to lowest
eig_pairs.sort(reverse=True)
# select the top k eig_vec
feature=np.array([ele[1] for ele in eig_pairs[:k]])
#get new data
data=np.dot(norm_X,np.transpose(feature))
return data
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))
上面代碼實現了對數據X進行特征的降維。結果如下:
[[-0.50917706],[-2.40151069],[]-3.7751606],[1.20075534],[2.05572155],[3.42937146]]
2)用sklearn的PCA
##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X)
相關博客:
Reference:
(1) 主成分分析(PCA)原理詳解
http://blog.csdn.net/zhongkelee/article/details/44064401
(2) 機器學習之PCA主成分分析 - steed灬 - 博客園
https://www.cnblogs.com/steed/p/7454329.html
(3) 簡單易學的機器學習算法——主成分分析(PCA)
https://blog.csdn.net/google19890102/article/details/27969459
(4) 機器學習實戰之PCA - 笨鳥多學 - 博客園
https://www.cnblogs.com/zy230530/p/7074215.html
(5) 機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用 - LeftNotEasy - 博客園
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6) 從PCA和SVD的關系拾遺
https://blog.csdn.net/Dark_Scope/article/details/53150883
(7) CodingLabs - PCA的數學原理
http://blog.codinglabs.org/articles/pca-tutorial.html
(8) PCA(主成分分析)python實現
https://www.jianshu.com/p/4528aaa6dc48
(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的應用及部分源碼分析
https://www.cnblogs.com/lochan/p/7001907.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
