1. 程式人生 > >sklean 資料集特徵提取

sklean 資料集特徵提取

1 利用地方差的方法減少特徵數也及(PCA)

去除那些方差不滿足基本設定的門限值得特徵,特別是方差值為零的,因為方差值為零,那麼資料集在該方向上比較密集,這資料無法通過學習來分類,因此該維度上的向量對特徵的分類沒有太多用處,因此可以去除該維度的特徵,以減少計算複雜度。

例如,假設我們有一個具有布林功能的資料集,我們想要刪除在超過80%的樣本中要麼是一個或零(on或off)的所有特性。布林特徵是伯努利隨機變數,並給出了這些變數的方差

\mathrm{Var}[X] = p(1 - p)

我們可以選擇門限是0.8*(1-0.8)

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]] >>> sel = VarianceThreshold(threshold=(.8 * (1 - .8))) >>> sel.fit_transform(X) array([[0, 1], [1, 0], [0, 0], [1, 1], [1, 0], [1, 1]])
就像預期的一樣,刪除了資料集的第一列,該列為零的概率p=5/6.0.8

2單變數特徵選擇

單變數特徵選擇是通過單變數統計測試選擇最佳的特徵變數,他可以被看做是對估計器的預處理步驟。

scikit- learn將特徵選擇例程作為實現轉換方法的物件公開:

1 選擇最好的K個特徵,留下得分最好的K個特徵,去掉其他的特徵維度

2 按百分率選擇,去掉除使用者指定的百分率高的特徵維度

對每個特性使用通用的單變數統計測試,假陽性率的選擇,錯誤發現率的選擇,或家庭明智的錯誤選擇。

允許使用可配置策略執行單特性選擇。這使得我們可以使用超引數搜尋估計器來選擇最優的單變數選擇策略

例如,我們可以對樣本進行\chi^2測試,以獲取以下兩個最佳特性:

>>> from sklearn.datasets
import load_iris >>> from sklearn.feature_selection import SelectKBest >>> from sklearn.feature_selection import chi2 >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> X.shape (150, 4) >>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y) >>> X_new.shape (150, 2)
基於f檢驗的方法估計了兩個隨機變數之間的線性依賴程度。另一方面,互資訊方法可以捕獲任何型別的統計依賴項,但作為非引數,

它們需要更多的樣本來進行準確的估計。

注意不要使用帶有分類問題的迴歸評分功能,您將會得到無用的結果。

單特徵選擇

print(__doc__)

import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets, svm
from sklearn.feature_selection import SelectPercentile, f_classif

# #############################################################################
# Import some data to play with

# The iris dataset
iris = datasets.load_iris()

# Some noisy data not correlated
E = np.random.uniform(0, 0.1, size=(len(iris.data), 20))

# Add the noisy data to the informative features
X = np.hstack((iris.data, E))
y = iris.target

plt.figure(1)
plt.clf()

X_indices = np.arange(X.shape[-1])

# #############################################################################
# Univariate feature selection with F-test for feature scoring
# We use the default selection function: the 10% most significant features
selector = SelectPercentile(f_classif, percentile=10)
selector.fit(X, y)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
plt.bar(X_indices - .45, scores, width=.2,
        label=r'Univariate score ($-Log(p_{value})$)', color='darkorange',
        edgecolor='black')

# #############################################################################
# Compare to the weights of an SVM
clf = svm.SVC(kernel='linear')
clf.fit(X, y)

svm_weights = (clf.coef_ ** 2).sum(axis=0)
svm_weights /= svm_weights.max()

plt.bar(X_indices - .25, svm_weights, width=.2, label='SVM weight',
        color='navy', edgecolor='black')

clf_selected = svm.SVC(kernel='linear')
clf_selected.fit(selector.transform(X), y)

svm_weights_selected = (clf_selected.coef_ ** 2).sum(axis=0)
svm_weights_selected /= svm_weights_selected.max()

plt.bar(X_indices[selector.get_support()] - .05, svm_weights_selected,
        width=.2, label='SVM weights after selection', color='c',
        edgecolor='black')


plt.title("Comparing feature selection")
plt.xlabel('Feature number')
plt.yticks(())
plt.axis('tight')
plt.legend(loc='upper right')
plt.show()
3 基於L1的特徵選擇

用L1規範對線性模型進行了處理,得到了稀疏解:

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)
在SVM和邏輯迴歸方面,引數C控制係數率,C越小,選擇的特徵就越少。對於Lasso來說,alpha引數越高,選擇的特徵就越少。
4基於樹的特徵選擇
from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier()
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)
特徵的提取經常被作為管道的一部分,特徵提取經常被用在機器學習的資料預處理階段,因此建議使用sklearn.pipeline.Pipeline:
clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)
在這段程式碼中,我們使用了sklearn . svm。LinearSVC加上sklearn.feature_selection。SelectFromModel以評估特性的重要性,並選擇最相關的特性。這時,一個sklearn.ensemble。隨機森林分類器被訓練在轉換的輸出上,即只使用相關的特徵。您可以使用其他特性選擇方法和分類器來執行類似的操作,這些方法提供了一種評估特性輸入的方法