【華為雲技術分享】【Python算法】分類與預測——Python隨機森林


1.隨機森林定義

  隨機森林是一種多功能的機器學習算法,能夠執行回歸和分類的任務。同時,它也是一種數據降維手段,在處理缺失值、異常值以及其他數據探索等方面,取得了不錯的成效。另外,它還擔任了集成學習中的重要方法,在將幾個低效模型整合為一個高效模型時大顯身手。在隨機森林中,會生成很多的決策樹,當在基於某些屬性對一個新的對象進行分類判別時,隨機森林中的每一棵樹都會給出自己的分類選擇,並由此進行“投票”,森林整體的輸出結果將會是票數最多的分類選項;而在回歸問題中,隨機森林的輸出將會是所有決策樹輸出的平均值。

2.隨機森林的優缺點

  該算法的優點主要有以下幾個方面:
  隨機森林算法能解決分類與回歸兩種類型的問題,並在這兩個方面都有相當好的估計表現;
  隨機森林對於高維數據集的處理能力令人興奮,它可以處理成千上萬的輸入變量,並確定最重要的變量,因此被認為是一個不錯的降維方法。此外,該模型能夠輸出變量的重要性程度,這是一個非常便利的功能;
  在對缺失數據進行估計時,隨機森林是一個十分有效的方法。就算存在大量的數據缺失,隨機森林也能較好地保持精確性;
  當存在分類不平衡的情況時,隨機森林能夠提供平衡數據集誤差的有效方法;

模型的上述性能可以被擴展運用到未標記的數據集中,用於引導無監督聚類、數據透視和異常檢測;
  隨機森林算法中包含了對輸入數據的重復自抽樣過程,即所謂的bootstrap抽樣。

  這樣一來,數據集中大約三分之一將沒有用於模型的訓練而是用於測試,這樣的數據被稱為out of bag samples,通過這些樣本估計的誤差被稱為out of bag error。研究表明,這種out of bag方法的與測試集規模同訓練集一致的估計方法有着相同的精確程度,因此在隨機森林中我們無需再對測試集進行另外的設置。

該算法的缺點主要有以下幾個方面:
  (1)隨機森林在解決回歸問題時並沒有像它在分類中表現的那么好,這是因為它並不能給出一個連續型的輸出。
  (2)當進行回歸時,隨機森林不能夠作出超越訓練集數據范圍的預測,這可能導致在對某些還有特定噪聲的數據進行建模時出現過度擬合。
  (3)對於許多統計建模者來說,隨機森林給人的感覺像是一個黑盒子—幾乎無法控制模型內部的運行,只能在不同的參數和隨機種子之間進行嘗試。

3.隨機森林執行步驟

  在隨機森林中,每一個決策樹“種植”和“生長”的規則如下所示:
  (1) 假設訓練集中的樣本個數為N,然后通過有重置的重復多次抽樣來獲得這N個樣 本,這樣的抽樣結果將作為生成決策樹的訓練集;
  (2) 如果有M個輸入變量,每個節點都將隨機選擇m(m<M)個特定的變量,然后運用這m個變量來確定最佳的分裂點。在決策樹的生成過程中,m的值是保持不變的;
  (3) 每棵決策樹都最大可能地進行生長而不進行剪枝;
  (4) 通過對所有的決策樹進行加總來預測新的數據(在分類時采用多數投票,在回歸時 采用平均)。

4.操作系統

  操作機:Linux_Ubuntu
  操作機默認用戶:root

5.實驗工具

image.png

Python是一種計算機程序設計語言。是一種動態的、面向對象的腳本語言,最初被設計用於編寫自動化腳本(shell),隨着版本的不斷更新和語言新功能的添加,越來越多被用於獨立的、大型項目的開發。Python已經成為最受歡迎的程序設計語言之一。自從2004年以后,python的使用率呈線性增長。2011年1月,它被TIOBE編程語言排行榜評為2010年度語言。

由於Python語言的簡潔性、易讀性以及可擴展性,在國外用Python做科學計算的研究機構日益增多,一些知名大學已經采用Python來教授程序設計課程。例如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用Python語言講授。

眾多開源的科學計算軟件包都提供了Python的調用接口,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而Python專用的科學計算擴展庫就更多了,例如如下3個十分經典的科學計算擴展庫:NumPy、SciPy和matplotlib,它們分別為Python提供了快速數組處理、數值運算以及繪圖功能。因此Python語言及其眾多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、制作圖表,甚至開發科學計算應用程序。

6.Numpy

NumPy系統是Python的一種開源的數值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結構要高效的多(該結構也可以用來表示矩陣(matrix))。

NumPy(Numeric Python)提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專為進行嚴格的數字處理而產生。多為很多大型金融公司使用,以及核心的科學計算組織如:Lawrence Livermore,NASA用其處理一些本來使用C++,Fortran或Matlab等所做的任務。

7.scikit-learn

image.png

scikit-learn,Python 中的機器學習,簡單高效的數據挖掘和數據分析工具,可供大家使用,可在各種環境中重復使用,建立在 NumPy,SciPy 和 matplotlib 上開放源碼,可商業使用 - BSD license。

8.Matplotlib

image.png

Matplotlib 是一個 Python 的 2D繪**,它以各種硬拷貝格式和跨平台的交互式環境生成出版質量級別的圖形。通過 Matplotlib,開發者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等。

9.pandas

image.png

Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標准的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。

10.導入所需要的庫:numpy,matplotlib.pyplot,pandas

代碼如下:

1 # Importing the libraries
2 import numpy as np
3 import matplotlib.pyplot as plt
4 import pandas as pd

11.加載數據集

代碼如下:

1 # Importing the dataset
2 dataset = pd.read_csv('/mnt/dataset_29/Social_Network_Ads_82e4aa0627105a2d22b70d7ad0bfeda0.csv')   注意:數據集以實際位置為准
3 X = dataset.iloc[:, [2, 3]].values
4 y = dataset.iloc[:, 4].values

注意:實驗中以數據集的具體為准。

image.png

如下給出數據,可將數據創建響相應的數據集用於字日常訓練,也可在實驗平台中數據集模塊下的的“社交網絡數據集”中進行查看。
數據集如下:(見附件)

12.將數據集分割為訓練集和測試集

代碼如下:

1 # Splitting the dataset into the Training set and Test set
2 from sklearn.model_selection import train_test_split
3 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

13.特征縮放

代碼如下:

1 # Feature Scaling
2 from sklearn.preprocessing import StandardScaler
3 sc = StandardScaler()
4 X_train = sc.fit_transform(X_train)
5 X_test = sc.transform(X_test)

image.png

14.調試訓練集的隨機森林

代碼如下:

1 from sklearn.ensemble import RandomForestClassifier
2 classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
3 classifier.fit(X_train, y_train)

15.對測試集進行分類

代碼如下:

1 # Predicting the Test set results
2 y_pred = classifier.predict(X_test)

16.制作混淆矩陣來評估模型性能

代碼如下:

1 # Making the Confusion Matrix
2 from sklearn.metrics import confusion_matrix
3 cm = confusion_matrix(y_test, y_pred)

17.繪制訓練數據分類結果

代碼如下:

 1 # Visualising the Training set results
 2 from matplotlib.colors import ListedColormap
 3 X_set, y_set = X_train, y_train
 4 X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
 5                      np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
 6 plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
 7              alpha = 0.75, cmap = ListedColormap(('red', 'green')))
 8 plt.xlim(X1.min(), X1.max())
 9 plt.ylim(X2.min(), X2.max())
10 for i, j in enumerate(np.unique(y_set)):
11     plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
12                 c = ListedColormap(('orange', 'blue'))(i), label = j)
13 plt.title('Classifier (Training set)')
14 plt.xlabel('Age')
15 plt.ylabel('Estimated Salary')
16 plt.legend()
17 plt.show()

訓練數據分類結果如下:

image.png

18.繪制測試數據分類結果

代碼如下:

 1 # Visualising the Test set results
 2 from matplotlib.colors import ListedColormap
 3 X_set, y_set = X_test, y_test
 4 X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
 5                      np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
 6 plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
 7              alpha = 0.75, cmap = ListedColormap(('red', 'green')))
 8 plt.xlim(X1.min(), X1.max())
 9 plt.ylim(X2.min(), X2.max())
10 for i, j in enumerate(np.unique(y_set)):
11     plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
12                 c = ListedColormap(('orange', 'blue'))(i), label = j)
13 plt.title('Classifier (Test set)')
14 plt.xlabel('Age')
15 plt.ylabel('Estimated Salary')
16 plt.legend()
17 plt.show()

image.png

社交網絡測試數據集.csv.zip

作者:Micker


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM