前情回顧算法
100天搞定機器學習|Day19-20 加州理工學院公開課:機器學習與數據挖掘
100天搞定機器學習|Day21 Beautiful Soup
100天搞定機器學習|Day23-25 決策樹及Python實現
前言: 隨機森林是一個很是靈活的機器學習方法,從市場營銷到醫療保險有着衆多的應用。它能夠用於市場營銷對客戶獲取和存留建模或預測病人的疾病風險和易感性。
隨機森林可以用於分類和迴歸問題,能夠處理大量特徵,並可以幫助估計用於建模數據變量的重要性。
![100天搞定機器學習|Day33-34 隨機森林](https://upload-images.jianshu.io/upload_images/12686932-cdc582128c2c3dd2?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
隨機森林能夠用於幾乎任何一種預測問題(包括非線性問題)。它是一個相對較新的機器學習策略(90年代誕生於貝爾實驗室)能夠用在任何方面。它屬於機器學習中的集成學習
這一大類。
集成學習是將多個模型進行組合來解決單一的預測問題。它的原理是生成多個分類器模型,各自獨立地學習並做出預測。這些預測最後結合起來獲得預測結果,所以和單獨分類器的結果相比,結果同樣或更好。
隨機森林是集成學習的一個分支,由於它依靠於決策樹的集成。
咱們知道隨機森林是將其餘的模型進行聚合, 但具體是哪一種模型呢?從其名稱也能夠看出,隨機森林聚合的是分類(或迴歸) 樹。一顆決策樹是由一系列的決策組合而成的,可用於數據集的觀測值進行分類 。
引入的隨機森林算法將自動建立隨機決策樹羣。因爲這些樹是隨機生成的,大部分的樹(甚至 99.9%)對解決你的分類或迴歸問題是沒有有意義。
那麼,生成甚至上萬的糟糕的模型有什麼好處呢?好吧,這確實沒有。但有用的是,少數很是好的決策樹也隨之一塊兒生成了。
當你要作預測的時候,新的觀察值隨着決策樹自上而下走下來並被賦予一個預測值或標籤。一旦森林中的每棵樹都給有了預測值或標籤,全部的預測結果將被歸總到一塊兒,全部樹的投票返回作爲最終的預測結果。
簡單來講,99.9%不相關的樹作出的預測結果涵蓋全部的狀況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會脫穎而出,從而獲得一個好的預測結果。
隨機森林是機器學習方法中的Leatherman(多功能摺疊刀)。你幾乎能夠把任何東西扔給它。它在估計推斷映射方面作的特別好,從而不須要相似SVM醫同樣過多的調參(這點對時間緊迫的朋友很是好)。
隨機森林能夠在未經特地手工進行數據變換的狀況下學習。以函數f(x)=log(x)
爲例。
咱們將在Yhat本身的交互環境Rodeo
中利用Python生成分析數據,你能夠在here下載Rodeo
的Mac
,Windows
和Linux
的安裝文件。
首先,咱們先生成一下數據並添加噪聲。
獲得以下結果:
若是咱們創建了一個基本的線性模型經過使用x
來預測y
,咱們須要做一條直線,必定成都市算是平分log(x)
函數。而若是咱們使用隨機森林算法,它能夠更好的逼近log(x)
曲線從而使得它看起來更像實際的函數。
固然,你也能夠說隨機森林對log(x)
函數有點過擬合。無論怎麼樣,這說明了隨機森林並不限於線性問題。
隨機森林的一個最好用例是特徵選擇。嘗試不少個決策樹變量的一個副產品就是,你能夠檢查變量在每棵樹中表現的是最佳仍是最糟糕。
當一些樹使用一個變量,而其餘的不使用這個變量,你就能夠對比信息的丟失或增長。實現的比較好的隨機森林工具可以爲你作這些事情,因此你須要作的僅僅是去查看那個方法或參數。
在下述的例子中,咱們嘗試弄明白區分成酒或白酒時,哪些變量是最重要的。
隨機森林也很善長分類問題。它能夠被用於爲多個可能目標類別作預測,它也能夠在調整後輸出機率。你須要注意的一件事情是過擬合。
隨機森林容易產生過擬合,特別是在數據集相對小的時候。當你的模型對於測試集合作出「太好」的預測的時候就應該懷疑一下了。避免過擬合的一個方法是在模型中只使用有相關性的特徵,好比使用以前提到的特徵選擇。
隨機森林也能夠用於迴歸問題。
我發現,不像其餘的方法,隨機森林很是擅長於分類變量或分類變量與連續變量混合的狀況。
#導入庫
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#導入數據集
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
#將數據集拆分紅訓練集和測試集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
#特徵縮放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
#調試訓練集的隨機森林
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
classifier.fit(X_train, y_train)
#預測測試集結果
y_pred = classifier.predict(X_test)
#生成混淆矩陣,也稱做偏差矩陣
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
#將訓練集結果可視化
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Random Forest Classification (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()
#將測試集結果可視化
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Random Forest Classification (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()複製代碼