隨機森林分類器
隨機森林的英文是 Random Forest,英文簡寫是 RF。它實際上是一個包含多個決策樹的分類器,每一個子分類器都是一棵 CART 分類回歸樹。做分類的時候,輸出結果是每個子分類器的分類結果中最多的那個;做回歸的時候,輸出結果是每棵 CART 樹的回歸結果的平均值。
在 sklearn 中,用 RandomForestClassifier() 構造隨機森林模型, fit 函數擬合,使用 predict 函數預測。
構造參數
from sklearn.model_selection import GridSearchCV
GridSearchCV,它是 Python 的參數自動搜索模塊。只要告訴它想要調優的參數以及參數的取值范圍,它就會把所有的情況都跑一遍,然后選出哪個參數是最優的,并給出結果。
# -*- coding: utf-8 -*-
# 使用 RandomForest 對 IRIS 數據集進行分類
# 利用 GridSearchCV 尋找最優參數
#得出結果當 n_estimators=6 的時候,是最優參數,也就是隨機森林一共有 6 個子決策樹
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
rf = RandomForestClassifier()
parameters = {"n_estimators": range(1,11)}
iris = load_iris()
# 使用 GridSearchCV 進行參數調優
clf = GridSearchCV(estimator=rf, param_grid=parameters)
# 對 iris 數據集進行分類
clf.fit(iris.data, iris.target)
print(" 最優分數: %.4lf" %clf.best_score_)
print(" 最優參數:", clf.best_params_)
Pipeline 管道機制進行流水線作業
# -*- coding: utf-8 -*-
# 使用 RandomForest 對 IRIS 數據集進行分類
# 利用 GridSearchCV 尋找最優參數, 使用 Pipeline 進行流水作業
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
rf = RandomForestClassifier()
parameters = {"randomforestclassifier__n_estimators": range(1,11)}
iris = load_iris()
pipeline = Pipeline([
('scaler', StandardScaler()),
('randomforestclassifier', rf)
])
# 使用 GridSearchCV 進行參數調優
clf = GridSearchCV(estimator=pipeline, param_grid=parameters)
# 對 iris 數據集進行分類
clf.fit(iris.data, iris.target)
print(" 最優分數: %.4lf" %clf.best_score_)
print(" 最優參數:", clf.best_params_)
信用卡違約率分析
有個疑惑,為什么分類器構造參數要adaboostclassifier__n_estimators': [10, 50, 100]這樣寫,不可以直接n_estimators :[10, 50, 100];猜想:是因為用了pipeline,所以格式固定。
數據地址https://github.com/cystanford/credit_default
# -*- coding: utf-8 -*-
# 信用卡違約率分析
import pandas as pd
from sklearn.model_selection import learning_curve, train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from matplotlib import pyplot as plt
import seaborn as sns
# 數據加載
data = pd.read_csv('Desktop/UCI_Credit_Card.csv')
# 數據探索
print(data.shape) # 查看數據集大小
print(data.describe()) # 數據集概覽
print(data.info()) #查看數據的信息,包括每個字段的名稱、非空數量、字段的數據類型
# 查看下一個月違約率的情況
next_month = data['default.payment.next.month'].value_counts()
print(next_month)
df = pd.DataFrame({'default.payment.next.month': next_month.index,'values': next_month.values})
print(df.head())
plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標簽
plt.figure(figsize = (6,6))
plt.title('信用卡違約率客戶\n (違約:1,守約:0)')
sns.set_color_codes("pastel")
sns.barplot(x = 'default.payment.next.month', y="values", data=df)
locs, labels = plt.xticks()
plt.show()
# 特征選擇,去掉 ID 字段、最后一個結果字段即可
data.drop(['ID'], inplace=True, axis =1) #ID 這個字段沒有用
target = data['default.payment.next.month'].values
columns = data.columns.tolist()
columns.remove('default.payment.next.month')
features = data[columns].values
# 30% 作為測試集,其余作為訓練集
train_x, test_x, train_y, test_y = train_test_split(features, target, test_size=0.30, stratify = target, random_state = 1)
# 構造各種分類器
classifiers = [
SVC(random_state = 1, kernel = 'rbf'),
DecisionTreeClassifier(random_state = 1, criterion = 'gini'),
RandomForestClassifier(random_state = 1, criterion = 'gini'),
KNeighborsClassifier(metric = 'minkowski'),
AdaBoostClassifier(random_state=None)
]
# 分類器名稱
classifier_names = [
'svc',
'decisiontreeclassifier',
'randomforestclassifier',
'kneighborsclassifier',
'adaboostclassifier'
]
# 分類器參數
classifier_param_grid = [
{'svc__C':[1], 'svc__gamma':[0.01]},
{'decisiontreeclassifier__max_depth':[6,9,11]},
{'randomforestclassifier__n_estimators':[3,5,6]} ,
{'kneighborsclassifier__n_neighbors':[4,6,8]},
{'adaboostclassifier__n_estimators': [10, 50, 100]}
]
# 對具體的分類器進行 GridSearchCV 參數調優
def GridSearchCV_work(pipeline, train_x, train_y, test_x, test_y, param_grid, classifier_names,score = 'accuracy'):
response = {}
gridsearch = GridSearchCV(estimator = pipeline, param_grid = param_grid, scoring = score)
# 尋找最優的參數 和最優的準確率分數
search = gridsearch.fit(train_x, train_y)
print("GridSearch 最優參數:", search.best_params_)
print("GridSearch 最優分數: %0.4lf" %search.best_score_)
predict_y = gridsearch.predict(test_x)
print(classifier_names," 準確率 %0.4lf" %accuracy_score(test_y, predict_y))
response['predict_y'] = predict_y
response['accuracy_score'] = accuracy_score(test_y,predict_y)
return response
for model, model_name, model_param_grid in zip(classifiers, classifier_names, classifier_param_grid):
pipeline = Pipeline([
('scaler', StandardScaler()),
(model_name, model)
])
result = GridSearchCV_work(pipeline, train_x, train_y, test_x, test_y, model_param_grid , model_name, score = 'accuracy')