RandomForest算法(有監督學習),可以根據輸入數據,選擇最佳特征組合,減少特征冗余;
原理:由於隨機決策樹生成過程采用的Boostrap,所以在一棵樹的生成過程並不會使用所有的樣本,未使用的樣本就叫(Out_of_bag)袋外樣本,通過袋外樣本,可以評估這個樹的准確度,其他子樹葉按這個原理評估,最后可以取平均值,即是隨機森林算法的性能;
特征選擇原理:因為袋外樣本的存在,因此不需要進行十字交叉測試(節省時間),通過依次對每個特征賦予一個隨機數,觀察算法性能的變化,倘若變化大,則說明該特征重要,sklearn中會對每個特征賦予一個分數,分數越大,特征越重要,因此,可以根據特征重要性排序,然后選擇最佳特征組合;
隨機森林算法特征維度,不同於PCA,隨機森林算法能夠考慮到特征對類別的影響,而PCA是單純的數據方差;但是隨機森林的缺點是需要迭代計算,如果在大數據條件下,進行選擇,就難免有點捉襟見肘了;與LDA區別在於:LDA根據標簽,通過變換將同標簽數據距離縮小,將累間距離方法;LDA是一種有監督方法,PCA屬於無監督方法;
以上是原理和一些個人見解;現在上代碼;已經在工作中跑了,學了Python的應該都能看懂,只要改一下數據路徑,初始特征選擇數量等就可以使用,不懂的可以問我,博客會常在的, 沒全部注釋!
還有另外一個特征選擇,就是通過利用oob對每個特征,迭代進行,評估分數,然后做一個排序,分數越高,特征越重要,然后利用分數由到到低,進行組合,在看模型是否精度是否發生變化,從而選擇最優特征組合,這是另一個方法,也是一下代碼的由來;
"""
Created on Mon Mar 19 20:22:09 2018
@author: test
function: iteritor for features combintaion
date:2018/3/19
"""
import copy
import sys
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
data = pd.read_csv(r"C:\Users\huzhipeng_sx\Desktop\data", header=None, sep='\t')
y_train = data[0].values
X_train = data.drop(0, axis=1).values
X_train = pd.DataFrame(np.delete(X_train, -5, axis=1))
features_name = ['a', 'b', 'c']
rf = RandomForestClassifier(n_estimators=200, oob_score=True)
rf.fit(X_train, y_train)
features_imp = rf.feature_importances_
X_train = X_train.as_matrix() # 輸入要是數組,不然無法切片,報錯slice
def select_combine(X_train, y_train, features_name, features_imp, select_num):
oob_result = []
fea_result = []
features_imp = list(features_imp)
iter_count = X_train.shape[1] - select_num # 迭代次數
if iter_count < 0:
print("select_nume must less or equal X_train columns")
else:
features_test = copy.deepcopy(features_imp) # 生成一個排序特征,進行篩選
features_test.sort()
features_test.reverse()
while iter_count >= 0:
iter_count -= 1
train_index = [features_imp.index(j) for j in features_test[:select_num]]
train_feature_name = [features_name[k] for k in train_index][0]
train_data = X_train[:, train_index]
rf.fit(train_data, y_train)
acc = rf.oob_score_
print(acc)
oob_result.append(acc)
fea_result.append(train_index)
if select_num < X_train.shape[1]:
select_num += 1
else:
break
return max(oob_result), oob_result, fea_result[oob_result.index(max(oob_result))]
select_num = 20
max_result, oob_result, fea_result = select_combine(X_train, y_train, features_name, features_imp, select_num)
本文鏈接:https: // blog.csdn.net / zehui6202 / article / details / 79625639