Python28-6 隨機森林

隨機森林算法詳細介紹

1. 理論背景

隨機森林(Random Forest)是一種由Leo Breiman和Adele Cutler在2001年提出的集成學習方法。它結合了多個決策樹的預測結果,以提高模型的準確性和魯棒性。

2. 算法細節

隨機森林的構建過程可以分為以下幾個步驟:

  1. Bootstrap采樣:從原始數據集中隨機選擇樣本,有放回地生成多個子樣本集(即每個子樣本集中可能包含重復的樣本)。

  2. 決策樹構建:對每個子樣本集構建一個決策樹。在構建每棵決策樹時,對每個節點選擇的特征是從所有特征中隨機選取的子集。

  3. 集成預測:對分類任務,通過對所有決策樹的投票結果進行多數投票來確定最終的分類結果。對回歸任務,通過對所有決策樹的預測結果取平均值來確定最終的回歸結果。

3. 算法優點
  • 減少過擬合:通過對多個決策樹的結果進行平均或投票,減少了單棵決策樹過擬合的風險。

  • 高準確率:由于結合了多個模型的預測結果,通常比單獨的決策樹模型具有更高的預測準確性。

  • 處理高維數據:能夠處理含有大量特征的數據,并能有效地進行特征選擇。

  • 抗噪聲能力強:由于集成了多個決策樹的結果,對噪聲數據具有較好的魯棒性。

Python實現與可視化示例

下面是一個詳細的Python示例,展示如何使用隨機森林算法進行泰坦尼克號數據集的分類任務。泰坦尼克號數據集(Titanic Dataset)是機器學習領域中常用的經典數據集之一,廣泛用于分類模型的訓練和測試。這個數據集記錄了泰坦尼克號1912年沉船事故中的乘客信息和他們的生還情況。通過分析這些數據,機器學習模型可以預測某個乘客是否在事故中幸存。泰坦尼克號數據集通常包括以下幾個文件:train.csv:訓練數據集,用于模型訓練test.csv:測試數據集,用于模型測試;gender_submission.csv:提交格式示例,展示提交預測結果的格式。

數據集中包含多個特征,每個特征描述了乘客的不同方面:

  • PassengerId:乘客ID,唯一標識每個乘客。

  • Survived:生還情況(0 = 未生還,1 = 生還)。

  • Pclass:客艙等級(1 = 頭等艙,2 = 二等艙,3 = 三等艙)。

  • Name:乘客姓名。

  • Sex:性別(male = 男性,female = 女性)。

  • Age:年齡。

  • SibSp:在船上的兄弟姐妹/配偶數量。

  • Parch:在船上的父母/子女數量。

  • Ticket:船票號碼。

  • Fare:票價。

  • Cabin:客艙號。

  • Embarked:登船港口(C = Cherbourg, Q = Queenstown, S = Southampton)。

import?os
import?pandas?as?pd
import?numpy?as?np
import?matplotlib.pyplot?as?plt
import?seaborn?as?sns
from?sklearn.ensemble?import?RandomForestClassifier??#?導入隨機森林分類器
from?sklearn.model_selection?import?train_test_split??#?導入數據集劃分工具
from?sklearn.metrics?import?classification_report,?confusion_matrix,?roc_curve,?auc??#?導入評估工具
from?sklearn.preprocessing?import?LabelEncoder??#?導入標簽編碼器
from?sklearn.manifold?import?TSNE??#?導入t-SNE降維工具#?加載數據
train?=?pd.read_csv('Titanic_train.csv')??#?讀取訓練數據集
test?=?pd.read_csv('Titanic_test.csv')??#?讀取測試數據集#?數據預處理
def?preprocess_data(df):df['Age'].fillna(df['Age'].median(),?inplace=True)??#?填充缺失的年齡數據為中位數df['Embarked'].fillna(df['Embarked'].mode()[0],?inplace=True)??#?填充缺失的登船港口為眾數df['Fare'].fillna(df['Fare'].median(),?inplace=True)??#?填充缺失的票價為中位數df.drop(['Cabin',?'Ticket',?'Name'],?axis=1,?inplace=True)??#?刪除不必要的特征df['Sex']?=?LabelEncoder().fit_transform(df['Sex'])??#?將性別轉換為數值df['Embarked']?=?LabelEncoder().fit_transform(df['Embarked'])??#?將登船港口轉換為數值return?dftrain?=?preprocess_data(train)??#?預處理訓練數據
test?=?preprocess_data(test)??#?預處理測試數據#?特征和標簽
X?=?train.drop('Survived',?axis=1)??#?提取特征變量
y?=?train['Survived']??#?提取標簽變量#?數據集劃分
X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.3,?random_state=42)??#?將數據集劃分為訓練集和測試集#?隨機森林模型
clf?=?RandomForestClassifier(n_estimators=100,?random_state=42)??#?初始化隨機森林分類器
clf.fit(X_train,?y_train)??#?訓練模型#?預測
y_pred?=?clf.predict(X_test)??#?對測試集進行預測#?結果評估
print("Classification?Report:")
print(classification_report(y_test,?y_pred))??#?打印分類報告#?混淆矩陣
conf_matrix?=?confusion_matrix(y_test,?y_pred)??#?計算混淆矩陣
print("Confusion?Matrix:")
print(conf_matrix)??#?打印混淆矩陣#?特征重要性
importances?=?clf.feature_importances_??#?獲取特征重要性
indices?=?np.argsort(importances)[::-1]??#?按重要性排序
feature_names?=?X.columns??#?獲取特征名稱#?可視化特征重要性
plt.figure(figsize=(10,?6))
plt.title("Feature?Importances")
plt.bar(range(X.shape[1]),?importances[indices],?align="center")
plt.xticks(range(X.shape[1]),?[feature_names[i]?for?i?in?indices],?rotation=45)
plt.xlabel("Feature")
plt.ylabel("Importance")
plt.show()??#?顯示特征重要性圖#?ROC曲線
y_score?=?clf.predict_proba(X_test)[:,?1]??#?獲取預測概率
fpr,?tpr,?_?=?roc_curve(y_test,?y_score)??#?計算ROC曲線
roc_auc?=?auc(fpr,?tpr)??#?計算AUCplt.figure(figsize=(10,?6))
plt.plot(fpr,?tpr,?color='darkorange',?lw=2,?label='ROC?curve?(area?=?%0.2f)'?%?roc_auc)
plt.plot([0,?1],?[0,?1],?color='navy',?lw=2,?linestyle='--')
plt.xlim([0.0,?1.0])
plt.ylim([0.0,?1.05])
plt.xlabel('False?Positive?Rate')
plt.ylabel('True?Positive?Rate')
plt.title('Receiver?Operating?Characteristic')
plt.legend(loc="lower?right")
plt.show()??#?顯示ROC曲線#?t-SNE圖
tsne?=?TSNE(n_components=2,?random_state=42)??#?初始化t-SNE
X_tsne?=?tsne.fit_transform(X_test)??#?對測試集特征進行降維plt.figure(figsize=(10,?6))
scatter?=?plt.scatter(X_tsne[:,?0],?X_tsne[:,?1],?c=y_test,?cmap='viridis')??#?繪制t-SNE圖
plt.legend(*scatter.legend_elements(),?title="Classes")
plt.title("t-SNE?visualization")
plt.xlabel("t-SNE?component?1")
plt.ylabel("t-SNE?component?2")
plt.show()??#?顯示t-SNE圖#?輸出:
"""
Classification?Report:precision????recall??f1-score???support0???????0.81??????0.90??????0.85???????1571???????0.83??????0.70??????0.76???????111accuracy???????????????????????????0.82???????268macro?avg???????0.82??????0.80??????0.81???????268
weighted?avg???????0.82??????0.82??????0.81???????268Confusion?Matrix:
[[141??16][?33??78]]
"""

輸出結果分類報告中的各項指標包括精確率(precision)、召回率(recall)、F1分數(f1-score)和支持(support)。這些指標可以幫助我們全面評估模型的性能。

Classification?Report:precision????recall??f1-score???support0???????0.81??????0.90??????0.85???????1571???????0.83??????0.70??????0.76???????111accuracy???????????????????????????0.82???????268macro?avg???????0.82??????0.80??????0.81???????268
weighted?avg???????0.82??????0.82??????0.81???????268
各項指標解釋
  1. 精確率(Precision)

    • 定義:精確率是正確預測的正樣本數占所有預測為正的樣本數的比例。

    • 計算公式:Precision=TPTP+FPPrecision=TP+FPTP

    • 解釋:模型在預測某一類(例如幸存者)時,預測正確的比例。對于0類(未幸存者),精確率是0.81;對于1類(幸存者),精確率是0.83。

  2. 召回率(Recall)

    • 定義:召回率是正確預測的正樣本數占所有實際為正的樣本數的比例。

    • 計算公式:Recall=TPTP+FNRecall=TP+FNTP

    • 解釋:模型在預測某一類時,能夠正確識別的比例。對于0類,召回率是0.90;對于1類,召回率是0.70。

  3. F1分數(F1-Score)

    • 定義:F1分數是精確率和召回率的調和平均數。

    • 計算公式:F1-Score=2×Precision×RecallPrecision+RecallF1-Score=2×Precision+RecallPrecision×Recall

    • 解釋:F1分數綜合考慮了精確率和召回率,提供了一個平衡的性能評估。對于0類,F1分數是0.85;對于1類,F1分數是0.76。

  4. 支持(Support)

    • 定義:支持是每個類別中的實際樣本數。

    • 解釋:支持表示的是數據集中每個類別的樣本數。0類有157個樣本,1類有111個樣本。

整體性能指標
  1. 準確率(Accuracy)

    • 定義:準確率是正確預測的樣本數占總樣本數的比例。

    • 計算公式:Accuracy=TP+TNTP+TN+FP+FNAccuracy=TP+TN+FP+FNTP+TN

    • 解釋:在所有樣本中,模型正確預測的比例。這里準確率是0.82(即82%的樣本被正確分類)。

  2. 宏平均(Macro Avg)

    • 定義:宏平均是對各類別的指標進行簡單平均,不考慮類別的樣本數。

    • 解釋:提供了各類別性能指標的整體平均值。這里宏平均的精確率是0.82,召回率是0.80,F1分數是0.81。

  3. 加權平均(Weighted Avg)

    • 定義:加權平均是對各類別的指標按其樣本數進行加權平均。

    • 解釋:考慮類別樣本數后的性能指標平均值。這里加權平均的精確率是0.82,召回率是0.82,F1分數是0.81。

混淆矩陣解釋

Confusion?Matrix:
[[141??16][?33??78]]

混淆矩陣顯示了實際標簽與預測標簽的對比。

  • 第一行表示實際為0類(未幸存者)的樣本:

    • 141:實際為0類且預測為0類(真正例,True Negative, TN)。

    • 16:實際為0類但預測為1類(假陽性,False Positive, FP)。

  • 第二行表示實際為1類(幸存者)的樣本:

    • 33:實際為1類但預測為0類(假陰性,False Negative, FN)。

    • 78:實際為1類且預測為1類(真陽性,True Positive, TP)。

特征重要性解釋

  • 解釋:特征重要性圖顯示了每個特征在模型中的重要性。通過這個圖,我們可以看到哪些特征對模型的預測影響最大。對于泰坦尼克號數據集,性別(Sex)乘客ID(PassengerId)票價(Fare)年齡(Age)可能是最重要的特征,因為這些因素在實際的生存情況中也是重要的。

  • 重要性:這種可視化幫助我們理解模型的決策過程,并提供關于數據特征的重要性的信息。

圖片

ROC曲線解釋

  • 解釋:ROC(Receiver Operating Characteristic)曲線是評估分類模型性能的常用工具,特別是在不平衡數據集上。它展示了模型在不同閾值下的真陽性率(True Positive Rate, TPR)和假陽性率(False Positive Rate, FPR)之間的關系。曲線下的面積(AUC, Area Under Curve)用于量化模型的總體性能。

  • 重要性:ROC曲線提供了一個整體的模型性能評估,特別是在不平衡數據集上,它可以展示模型在不同閾值下的表現。

  • 模型性能良好

    • 該模型的AUC值為0.87,接近1,說明模型在區分泰坦尼克號數據集中幸存者和未幸存者時表現較好。

    • TPR較高,意味著模型能夠正確識別大部分幸存者(正樣本)。

圖片

t-SNE圖解釋

  • 解釋:t-SNE圖是一種降維可視化方法,將高維數據投影到2維平面上。通過顏色表示不同類別的數據點(幸存者和未幸存者)。在泰坦尼克號數據集中,這可以幫助我們觀察數據在低維空間中的分布情況,查看數據是否存在明顯的聚類現象。

  • 重要性:這種可視化有助于直觀理解數據的內在結構和模型的分類效果,特別是觀察不同類別之間的分離情況。

圖片

t-SNE將高維數據降維到2維空間,降維后的兩個維度不是原始數據中的特定維度,而是t-SNE算法通過保持高維數據的鄰近關系優化得到的兩個新維度。圖中黃色和紫色的點分別代表兩個類別,即幸存者(1)和未幸存者(0)。

從整體上看,幸存者(黃色點)在t-SNE圖中分布較為分散,而未幸存者(紫色點)則在一些特定區域集中。這可能與泰坦尼克號數據集中某些關鍵特征(如性別、艙位等級、年齡等)有關,這些特征對生存概率有顯著影響。


以上內容總結自網絡,如有幫助歡迎轉發,我們下次再見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39845.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39845.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt——升級系列(Level Eight):界面優化

目錄 QSS 背景介紹 基本語法 QSS設置方式 指定控件樣式設置 全局樣式設置 從文件加載樣式表 使用Qt Designer 編輯樣式 選擇器 選擇器概況 子控件選擇器 偽類選擇器 樣式屬性 盒模型 控件樣式示例 按鈕 復選框、單選框 輸入框 列表 菜單欄 登錄界面 繪圖 基本概念 繪制各種形…

[Go 微服務] Kratos 使用的簡單總結

文章目錄 1.Kratos 簡介2.傳輸協議3.日志4.錯誤處理5.配置管理6.wire 1.Kratos 簡介 Kratos并不綁定于特定的基礎設施,不限定于某種注冊中心,或數據庫ORM等,所以您可以十分輕松地將任意庫集成進項目里,與Kratos共同運作。 API -&…

Linux內網端口轉公網端口映射

由于服務商做安全演練,把原先服務器內網的端口映射到外網端口全都關閉了,每次維護服務器特別麻煩,像數據庫查詢如果用原生的mysql 去連接,查詢返回的結果亂了,非常不方便。 查了服務還是可以正常訪問部分外網的&#x…

知識圖譜查詢語言的表示

文章目錄 SPARQL知識圖譜查詢基本構成常見的SPARQL查詢算子語義Markup表示語言SPARQL知識圖譜查詢基本構成 RDF 支持類似數據庫的查詢語言,叫作SPARQL,它提供了查詢RDF 數據的標準語法、處理SPARQL查詢的規則以及結果返回形式。 變量,RDF中的資源,以“?”或者“$”指示;…

【chatgpt】pytorch的全連接層FC

文章目錄 創建全連接層全連接層(線性層)使用 PyTorch 定義全連接層1. 定義一個全連接層2. 查看層的參數3. 使用全連接層 示例:構建一個簡單的神經網絡總結 打印FC參數輸出解釋完整代碼示例示例輸出總結 線性層的參數和屬性線性層的參數和屬性…

抖音外賣服務商入駐流程及費用分別是什么?入駐官方平臺的難度大嗎?

隨著抖音關于新增《【到家外賣】內容服務商開放準入公告》的意見征集通知(以下簡稱“通知”)的發布,抖音外賣服務商入駐流程及費用逐漸成為眾多創業者所關注和熱議的話題。不過,就當前的討論情況來看,這個話題似乎沒有…

軟件測試中安全測試包含內容及安全測試怎么測

一、軟件測試安全測試包含哪些 1. 漏洞掃描 漏洞掃描是軟件測試安全測試的基礎,它用于檢測應用程序和系統中存在的已知漏洞。安全測試工具如AppScan、OWASP ZAP和Nessus等可以對應用程序進行自動化掃描,發現可能存在的漏洞,如跨站點腳本&am…

7.2、指針變量的定義和使用

代碼 #include <iostream> using namespace std; #include <string>int main() {//定義指針int a 10;//指針定義語法&#xff1a;數據類型 * 指針變量名int * p;//讓指針記錄變量a的地址p &a;cout << "a的地址為&#xff1a;" << &am…

MySQL之應用層優化(二)

應用層優化 Web服務器問題 尋找最優并發度 每個Web服務器都有一個最佳并發度——就是說&#xff0c;讓進程處理請求盡可能快&#xff0c;并且不超過系統負載的最優的并發連接數。這就是前面說的最大系統容量。進行一個簡單的測量和建模&#xff0c;或者只是反復試驗&#xf…

2024年湖南省各市科小申報時間(科技型中小企業申報流程、條件、好處)新政

湖南省各市科小申報時間流程 一、評價管理 省科技廳牽頭負責科技型中小企業評價工作的組織和監督、實地核查、公示公告、入庫登記及編號撤銷和集中抽查工作&#xff0c;及時處理相關異議、投訴和舉報信息。 各市州科技局負責科技型中小企業評價工作的具體實施&#xff0c;組…

nginx SSI(Server Side Include)服務端包含 合并拼裝靜態內容

一、什么是SSI 在被傳送給瀏覽器之前&#xff0c;服務器會對 HTML 文檔進行完全地讀取、分析以及修改&#xff0c;使用SSI指令將文本、圖片或代碼信息包含到網頁中。對于整個頁面可以拆分成多個模塊&#xff0c;通過SSI指令將幾個模塊拼接成一個完整的頁面&#xff0c;當有內容…

【數據庫原理】課程筆記

數據庫原理 一、數據庫系統基礎 數據模型的類型 概念數據模型&#xff1a; 概念數據模型也稱概念模型或信息模型,是對現實世界中問題域內事務(特性)的描述,是以用戶觀點實現世界的模型(圖形表示)。主要用于描述事物的概念化結構,使數據庫的設計人員在設計初期,避開計算機系統及…

ATA-L2水聲功率放大器驅動水聲換能器的測試研究

隨著水聲通信技術的發展&#xff0c;水下通信設備也開始逐步走向實用化&#xff0c;為了滿足其實際的使用要求&#xff0c;功率放大器的設計需要具有高效率的特性&#xff0c;并能在水下長時間連續可靠的工作。 壓電陶瓷換能器主要負責電信號與聲信號之間的轉換&#xff0c;換能…

mybatis配置返回boolean類型

先大概說明一下ResultMap和ResultType的使用場景 ResultMap適用于復雜的查詢&#xff0c;可以處理多表關聯查詢、嵌套查詢等情況。通過ResultMap&#xff0c;可以更精確地控制查詢結果的映射。ResultType適用于簡單的查詢&#xff0c;而ResultMap適用于復雜的查詢。具體使用哪…

學習整理在php中使用PHPExcel讀取excel表列數大于Z時讀取不到的解決方案

php讀取excel列數大于Z時讀取不到 背景解決方案關鍵代碼 背景 表格數據超過26列&#xff0c; 也就是在Z列之前沒有AA列及以后的情況&#xff0c; 測試一直都沒有問題&#xff0c;超過&#xff0c;就會獲取不到數據了 解決方案 private function getExcelData(){//獲取excel文…

使用Python進行文件屬性修改

哈嘍,大家好,我是木頭左! 在計算機中,文件屬性是指與文件相關的元數據,如創建時間、修改時間、訪問時間等。這些屬性對于管理和組織文件非常重要。Python提供了一些內置的函數和方法,可以方便地修改文件的屬性。本文將介紹如何使用Python進行文件屬性的修改。 1. 獲取文件…

應用密碼學—(擴展)歐幾里得、DES、RSA、SHA-1算法

1. 歐幾里得算法 1.1 分析算法的實現原理 歐幾里德&#xff08;Euclid&#xff09;算法&#xff0c;也既常說的“輾轉相除法”&#xff0c;公式為gcd(m, n) { return gcd(n, m%n); }&#xff0c;對于任意兩個正整數m、n&#xff0c;每次求的一個數字r m % n&#xff0c;然后把…

教育場景中的自動化分揀系統!基于大象機器人UltraArm P340機械臂和傳送帶的實現

引言 今天我們將展示一個高度自動化的模擬場景&#xff0c;展示多個機械臂與傳送帶協同工作的高效分揀系統。在這個場景中&#xff0c;機械臂通過視覺識別技術對物體進行分類&#xff0c;并通過精確的機械操作將它們放置在指定的位置。這一系統不僅提高了分揀的速度和準確性&am…

PTrade怎么獲取KDJ隨機指標?想做量化策略怎么申請PTrade量化軟件?

get_KDJ - 隨機指標 get_KDJ(high, low, close, n9, m13, m23) 使用場景 該函數僅在回測、交易模塊可用 接口說明 獲取隨機指標KDJ指標的計算結果 PTrade是恒生公司開發的一款專業量化軟件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 參數 high&…

什么是分庫分表?它有哪些實現類型?

假如你正在使用關系型數據庫開發一款健康類系統。業務發展很好&#xff0c;系統有很多活躍的新老用戶&#xff0c;這些用戶會和平臺的醫生團隊進行交互&#xff0c;每天可能會生成數萬甚至數十萬級別的業務數據。這樣的話&#xff0c;隨著數據量越來越大&#xff0c;系統中的某…