數據分析的流程:
1 特征選擇
2 模型、算法
3 評價指標
怎么做整理:一是從項目中,做一個項目總結一個方法;二是平常最常用的。
會飛的蝸牛:
6.22特征選擇sklearn.feature_selection
首先根據客戶需求(市場監督管理局),整理出一些指標。
1. 過濾法
1.1方差選擇
方差表示離散程度,方差小表示特征值很穩定,沒有太大變化,故可以選擇方差大的特征來分析。
先要計算各個特征的方差,然后根據閾值,選擇方差大於閾值的特征。使用feature_selection庫的VarianceThreshold類來選擇特征。
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) ##方差選擇法,返回值為特征選擇后的數據
def var():
var=VarianceThreshold(threshold=1.0)
data=var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)
return None
var()
1.2單變量特征選擇
原理:分別單獨的計算每個變量的某個統計指標,根據該指標來判斷哪些指標重要,剔除那些不重要的指標。
A.分類(y離散):卡方檢驗、F檢驗、互信息
B.回歸(y連續):相關系數、互信息
互信息:一個隨機變量包含的關於另一個隨機變量的信息量
或者說一個隨機變量由於已知另一個隨機變量而減少的不確定性。
SelectKBest 移除得分前 k 名以外的所有特征(取top k)
SelectPercentile 移除得分在用戶指定百分比以后的特征(取top k%)
(1)卡方檢驗:
經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性.
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
X_new = SelectKBest(chi2, k=2).fit_transform(X, y) ##選擇了前2個特征
X_new.shape
(2)相關系數(距離相關系數)
Pearson相關系數的一個明顯缺陷是,作為特征排序機制,他只對線性關系敏感。如果關系是非線性的,即便兩個變量具有一一對應的關系,Pearson相關性也可能會接近0。
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0,1,size)
# pearsonr(x, y)的輸入為特征矩陣和目標向量
print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))
(3)互信息及最大相關系數(MINE庫安裝失敗)
互信息直接用於特征選擇其實不是太方便(不太適用於連續變量,在不同數據集上無法比較),用最大信息系數去改進,它首先尋找一種最優的離散化方式,然后把互信息取值轉換成一種度量方式,取值區間在[0,1]。
from minepy import MINE
m = MINE()
x = np.random.uniform(-1, 1, 10000)
m.compute_score(x, x**2)
print(m.mic())
(4)基於模型的特征排序
可以采用決策樹、隨機森林、SVM、LogisticRegression的方法,得到特征排序的重要性。
##波士頓房價數據 隨機森林
from sklearn.model_selection import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np
# 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))
# 注意X[:, i]shape(1,m)和X[:, i:i+1]的區別hape(m,1)
scores.append((format(np.mean(score), '.3f'), names[i]))
print(sorted(scores, reverse=True))
2.Wrapper(包裹法) 遞歸特征消除 (Recursive Feature Elimination)
遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,移除若干權值系數的特征,再基於新的特征集進行下一輪訓練。
sklearn官方解釋:對特征含有權重的預測模型(例如,線性模型對應參數coefficients),RFE通過遞歸減少考察的特征集規模來選擇特征。首先,預測模型在原始特征上訓練,每個特征指定一個權重。之后,那些擁有最小絕對值權重的特征被踢出特征集。如此往復遞歸,直至剩余的特征數量達到所需的特征數量。
RFECV 通過交叉驗證的方式執行RFE,以此來選擇最佳數量的特征:對於一個數量為d的feature的集合,他的所有的子集的個數是2的d次方減1(包含空集)。指定一個外部的學習算法,比如SVM之類的。通過該算法計算所有子集的validation error。選擇error最小的那個子集作為所挑選的特征
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
iris = load_iris()
#遞歸特征消除法,返回特征選擇后的數據
#遞歸特征消除法
#遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,消除若干權值系數的特征,再基於新的特征集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特征的代碼如下:
#參數estimator為基模型
#參數n_features_to_select為選擇的特征個數7
#print(iris.data[0:5])
print(iris.data[0:5])
print(iris.target[0:5])
print("-----------------------------------")
selector = RFE(estimator=LogisticRegression(), n_features_to_select=2).fit(iris.data, iris.target)
data = selector.transform(iris.data)
print(data[0:5])
print("-----------------------------------")
print(selector.ranking_)
3 Embedding(嵌入法)
3.1使用SelectFromModel選擇特征 (Feature selection using SelectFromModel)
基於機器學習模型的方法。有些機器學習方法本身就具有對特征進行打分的機制,或者很容易將其運用到特征選擇任務中,例如回歸模型,SVM,決策樹,隨機森林等等。其實Pearson相關系數等價於線性回歸里的標准化回歸系數。
3.1.1 基於L1的特征選擇 (L1-based feature selection)
使用L1范數作為懲罰項的線性模型(Linear models)會得到稀疏解:大部分特征對應的系數為0。當你希望減少特征的維度以用於其它分類器時,可以通過 feature_selection.SelectFromModel 來選擇不為0的系數。特別指出,常用於此目的的稀疏預測模型有 linear_model.Lasso(lasso回歸), linear_model.LogisticRegression(邏輯回歸)和 svm.LinearSVC(SVM支持向量機)
##對於SVM和邏輯回歸,參數C控制稀疏性:C越小,被選中的特征越少。對於Lasso,參數alpha越大,被選中的特征越少。
from sklearn.svm import LinearSVC ##SVM
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)
3.1.2 隨機稀疏模型 (Randomized sparse models)
基於L1的稀疏模型的局限在於,當面對一組互相關的特征時,它們只會選擇其中一項特征。為了減輕該問題的影響可以使用隨機化技術,通過_多次重新估計稀疏模型來擾亂設計矩陣_,或通過_多次下采樣數據來統計一個給定的回歸量被選中的次數_。
RandomizedLasso實現了使用這項策略的Lasso,RandomizedLogisticRegression 使用邏輯回歸,適用於分類任務。要得到整個迭代過程的穩定分數,你可以使用 lasso_stability_path
3.1.3基於樹的特征選擇
基於樹的預測模型(見 sklearn.tree 模塊,森林見 sklearn.ensemble 模塊)能夠用來計算特征的重要程度,因此能用來去除不相關的特征(結合 sklearn.feature_selection.SelectFromModel):
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)
4.Embedding將特征選擇過程融入pipeline (Feature selection as part of a pipeline)
特征選擇常常被當作學習之前的一項預處理。在scikit-learn中推薦使用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.RandomForestClassifier 模型使用轉換后的輸出訓練,即只使用被選出的相關特征。你可以選擇其它特征選擇方法,或是其它提供特征重要性評估的分類器。更多詳情見 sklearn.pipeline.Pipeline 相關示例。
二、特征提取方法--PCA、LDA、SVD
PCA和LDA都是用來降維的,適用於高斯分布的數據
LDA:https://www.cnblogs.com/simon-c/p/5023726.html
https://blog.csdn.net/weixin_41637300/article/details/84591348
https://blog.csdn.net/z962013489/article/details/79918758?utm_source=blogxgwz9
https://blog.csdn.net/u013719780/article/details/78312165
https://blog.csdn.net/qq_41398808/article/details/92440569
https://blog.csdn.net/z962013489/article/details/79871789?utm_source=blogxgwz5
https://nbviewer.jupyter.org/github/csuldw/MachineLearning/blob/master/LDA/lda.ipynb
SVD:https://www.cnblogs.com/endlesscoding/p/10033527.html