隨機森林R語言預測工具

TechSynapse發表於2024-07-01

隨機森林(Random Forest)是一種基於決策樹的整合學習方法,它透過構建多個決策樹並整合它們的預測結果來提高預測的準確性。在R語言中,我們可以使用randomForest包來構建和訓練隨機森林模型。以下是對隨機森林的詳細介紹以及使用R語言進行預測的程式碼示例。

1. R語言進行預測的程式碼示例

1.1 隨機森林簡介

隨機森林透過以下步驟進行構建:

(1)自助法抽樣(Bootstrap Sampling):從原始資料集中有放回地隨機抽取多個樣本集,用於訓練多棵決策樹。

(2)特徵隨機選擇:在訓練每棵決策樹時,從所有特徵中隨機選擇一部分特徵進行節點分裂。

(3)構建決策樹:基於自助法抽樣得到的樣本集和隨機選擇的特徵集,構建多棵決策樹。

(4)整合預測:對於分類問題,透過投票法(多數投票)整合所有決策樹的預測結果;對於迴歸問題,透過取平均值整合所有決策樹的預測結果。

隨機森林的優點包括:

  • 可以處理高維資料,無需進行特徵選擇。
  • 能夠學習特徵之間的相互影響,且不容易過擬合。
  • 對於不平衡的資料集,可以平衡誤差。
  • 相比單一決策樹,具有更高的預測準確性。

1.2 R語言程式碼示例

以下是一個使用R語言中的randomForest包進行隨機森林預測的程式碼示例:

# 安裝randomForest包(如果尚未安裝)  
install.packages("randomForest")  
  
# 載入randomForest包  
library(randomForest)  
  
# 載入資料集(這裡以iris資料集為例)  
data(iris)  
  
# 劃分訓練集和測試集  
set.seed(123) # 設定隨機種子以保證結果的可重複性  
train_index <- sample(1:nrow(iris), nrow(iris)*0.7) # 隨機選擇70%的資料作為訓練集  
train_data <- iris[train_index,]  
test_data <- iris[-train_index,]  
  
# 使用randomForest函式訓練隨機森林模型  
# ntree指定決策樹的數量,mtry指定每次分裂時隨機選擇的特徵數量  
model <- randomForest(Species ~ ., data=train_data, ntree=500, mtry=2)  
  
# 使用訓練好的模型對測試集進行預測  
predictions <- predict(model, newdata=test_data)  
  
# 評估模型效能  
# 對於分類問題,可以計算準確率、混淆矩陣等指標  
confusionMatrix <- table(predictions, test_data$Species)  
accuracy <- sum(diag(confusionMatrix)) / sum(confusionMatrix)  
print(paste("Accuracy:", accuracy))  
  
# 如果需要,還可以繪製特徵重要性圖  
# importance(model) # 返回特徵重要性矩陣  
# plot(importance(model)) # 繪製特徵重要性圖

1.3 實際應用意義

隨機森林在實際應用中具有廣泛的意義,特別是在處理複雜資料集和進行預測分析時。例如,在生物資訊學、醫學診斷、金融預測等領域,隨機森林可以用於分類、迴歸、特徵選擇等問題。透過整合多棵決策樹的預測結果,隨機森林可以提高預測的準確性,並降低過擬合的風險。此外,隨機森林還可以提供特徵重要性評估,有助於我們理解哪些特徵對預測結果具有重要影響。

2. 隨機森林R語言應用例項

當談到隨機森林的應用例項時,以下是一些具體的場景以及如何使用R語言中的randomForest包來實現這些例項的詳細程式碼示例。

2.1 疾病診斷(以乳腺癌診斷為例)

2.1.1 資料集:乳腺癌資料集(breastCancer

假設我們有一個乳腺癌資料集,其中包含一些與癌症相關的特徵和一個二分類結果(是否為惡性)。我們的目標是訓練一個隨機森林模型來預測新的病例是否為惡性。

2.1.2 程式碼示例

# 載入必要的包  
library(randomForest)  
  
# 載入資料集(這裡假設我們已經有了breastCancer資料集)  
# 如果需要,可以從外部資料來源載入,如read.csv  
data(breastCancer, package = "mlbench") # 假設breastCancer在mlbench包中  
  
# 劃分訓練集和測試集  
set.seed(123) # 為了結果的可復現性  
trainIndex <- sample(1:nrow(breastCancer), nrow(breastCancer)*0.7)  
trainData <- breastCancer[trainIndex, ]  
testData <- breastCancer[-trainIndex, ]  
  
# 使用隨機森林模型進行訓練  
rfModel <- randomForest(Class ~ ., data = trainData, ntree = 500, importance = TRUE)  
  
# 在測試集上進行預測  
predictions <- predict(rfModel, newdata = testData)  
  
# 檢視混淆矩陣和準確率  
confusionMatrix <- table(predictions, testData$Class)  
accuracy <- sum(diag(confusionMatrix)) / sum(confusionMatrix)  
print(paste("Accuracy:", accuracy))  
  
# 檢視特徵重要性  
importance(rfModel)  
  
# 繪製特徵重要性圖  
plot(rfModel, main="Feature Importance")

2.2 房價預測

2.2.1 資料集:房價資料集(假設為housingData

假設我們有一個房價資料集,其中包含房屋的各種特徵(如面積、房間數、地段等)和房屋的價格。我們的目標是預測新房屋的價格。

2.2.2 程式碼示例

# 載入必要的包  
library(randomForest)  
  
# 假設housingData已經載入到R環境中  
# 如果需要,可以從外部資料來源載入,如read.csv  
  
# 劃分特徵和目標變數  
features <- housingData[, -ncol(housingData)] # 假設最後一列是價格  
prices <- housingData[, ncol(housingData)]  
  
# 劃分訓練集和測試集  
set.seed(123)  
trainIndex <- sample(1:nrow(housingData), nrow(housingData)*0.7)  
trainFeatures <- features[trainIndex, ]  
trainPrices <- prices[trainIndex]  
testFeatures <- features[-trainIndex, ]  
testPrices <- prices[-trainIndex]  
  
# 使用隨機森林模型進行訓練  
rfModel <- randomForest(trainPrices ~ ., data = data.frame(trainPrices, trainFeatures), ntree = 500, importance = TRUE)  
  
# 在測試集上進行預測  
predictedPrices <- predict(rfModel, newdata = data.frame(testPrices = rep(NA, nrow(testFeatures)), testFeatures))  
  
# 評估預測結果(例如,使用均方誤差)  
mse <- mean((predictedPrices - testPrices)^2)  
print(paste("Mean Squared Error:", mse))  
  
# 檢視特徵重要性  
importance(rfModel)  
  
# 繪製特徵重要性圖  
plot(rfModel, main="Feature Importance")

請注意,上述程式碼示例中的資料集(breastCancerhousingData)是假設的,並且可能需要從外部資料來源載入。此外,對於房價預測,我們假設價格列是資料集的最後一列,並且在實際應用中可能需要進一步的資料預處理和特徵工程。同樣,隨機森林的引數(如ntree)也可以根據具體情況進行調整。

在R語言中,我們可以使用多種包來進行預測,例如randomForestcarete1071(對於SVM)、glmnet(對於彈性網路迴歸)等。以下我將給出幾個使用R語言進行預測的程式碼示例。

2.3 使用隨機森林進行預測

首先,我們需要安裝並載入randomForest包(如果尚未安裝)。

# 安裝randomForest包(如果尚未安裝)  
install.packages("randomForest")  
  
# 載入randomForest包  
library(randomForest)  
  
# 載入或建立資料  
# 這裡我們使用iris資料集作為示例  
data(iris)  
  
# 將資料集劃分為訓練集和測試集  
set.seed(123) # 為了結果的可重複性  
train_index <- sample(1:nrow(iris), 0.8 * nrow(iris))  
train_data <- iris[train_index, ]  
test_data <- iris[-train_index, ]  
  
# 使用訓練集訓練隨機森林模型  
rf_model <- randomForest(Species ~ ., data = train_data, ntree = 500)  
  
# 使用測試集進行預測  
rf_predictions <- predict(rf_model, newdata = test_data)  
  
# 檢視預測結果  
print(table(test_data$Species, rf_predictions))  
  
# 計算預測準確率  
accuracy <- sum(test_data$Species == rf_predictions) / nrow(test_data)  
print(paste("Accuracy:", accuracy))

2.4 使用邏輯迴歸進行預測(二分類問題)

# 載入MASS包(如果尚未安裝)  
# MASS包包含了用於邏輯迴歸的多個資料集  
install.packages("MASS")  
library(MASS)  
  
# 使用MASS包中的Pima Indians Diabetes資料集  
data(PimaIndiansDiabetes)  
  
# 將資料集劃分為訓練集和測試集  
set.seed(123)  
train_index <- sample(1:nrow(PimaIndiansDiabetes), 0.8 * nrow(PimaIndiansDiabetes))  
train_data <- PimaIndiansDiabetes[train_index, ]  
test_data <- PimaIndiansDiabetes[-train_index, ]  
  
# 使用訓練集訓練邏輯迴歸模型  
glm_model <- glm(diabetes ~ ., data = train_data, family = binomial)  
  
# 使用測試集進行預測(注意:邏輯迴歸預測的是機率,需要轉換為類別)  
glm_probabilities <- predict(glm_model, newdata = test_data, type = "response")  
glm_predictions <- ifelse(glm_probabilities > 0.5, "pos", "neg")  
  
# 檢視預測結果  
print(table(test_data$diabetes, glm_predictions))  
  
# 計算預測準確率(假設'pos'代表正類,'neg'代表負類)  
accuracy <- sum(test_data$diabetes == (glm_predictions == "pos")) / nrow(test_data)  
print(paste("Accuracy:", accuracy))

2.5 使用支援向量機(SVM)進行預測

# 安裝e1071包(如果尚未安裝)  
install.packages("e1071")  
library(e1071)  
  
# 使用iris資料集  
data(iris)  
  
# 將資料集劃分為訓練集和測試集  
set.seed(123)  
train_index <- sample(1:nrow(iris), 0.8 * nrow(iris))  
train_data <- iris[train_index, ]  
test_data <- iris[-train_index, ]  
  
# 將Species轉換為因子型別(如果尚未是)  
train_data$Species <- as.factor(train_data$Species)  
test_data$Species <- as.factor(test_data$Species)  
  
# 使用訓練集訓練SVM模型  
svm_model <- svm(Species ~ ., data = train_data, kernel = "radial", cost = 10, gamma = 0.1)  
  
# 使用測試集進行預測  
svm_predictions <- predict(svm_model, newdata = test_data)  
  
# 檢視預測結果  
print(table(test_data$Species, svm_predictions))  
  
# 計算預測準確率  
accuracy <- sum(test_data$Species == svm_predictions) / nrow(test_data)  
print(paste("Accuracy:", accuracy))

以上程式碼示例展示瞭如何在R語言中使用隨機森林、邏輯迴歸和支援向量機進行預測,並計算了預測準確率。請注意,這些示例使用了內建的資料集

3. 隨機森林的應用例項

3.1 鳶尾花資料集分類(Iris Dataset Classification)

鳶尾花資料集是一個常用的分類資料集,包含150個樣本,每個樣本有四個特徵(花萼長度、花萼寬度、花瓣長度、花瓣寬度),用於分類三種鳶尾花。

from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import accuracy_score  
  
# 載入鳶尾花資料集  
iris = load_iris()  
X = iris.data  
y = iris.target  
  
# 劃分訓練集和測試集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 建立隨機森林分類器  
clf = RandomForestClassifier(n_estimators=100, random_state=42)  
  
# 訓練模型  
clf.fit(X_train, y_train)  
  
# 預測測試集  
y_pred = clf.predict(X_test)  
  
# 計算準確率  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy}")

3.2 房價預測(Housing Price Prediction)

假設我們有一個房價資料集,包含房屋的特徵(如面積、臥室數、樓層數等)和對應的房價。

import pandas as pd  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestRegressor  
from sklearn.metrics import mean_squared_error  
  
# 載入資料(這裡假設我們有一個CSV檔案)  
data = pd.read_csv('housing_data.csv')  
X = data.drop('price', axis=1)  # 特徵  
y = data['price']  # 目標變數  
  
# 劃分訓練集和測試集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 建立隨機森林迴歸器  
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)  
  
# 訓練模型  
rf_regressor.fit(X_train, y_train)  
  
# 預測測試集  
y_pred = rf_regressor.predict(X_test)  
  
# 計算均方誤差  
mse = mean_squared_error(y_test, y_pred)  
print(f"Mean Squared Error: {mse}")

3.3 電影評論情感分析(Sentiment Analysis of Movie Reviews)

假設我們有一個電影評論資料集,包含評論文字和對應的情感標籤(正面或負面)。

from sklearn.datasets import fetch_20newsgroups  
from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import classification_report  
  
# 載入資料集(這裡使用20 Newsgroups資料集的一個子集作為示例)  
categories = ['alt.atheism', 'soc.religion.christian']  
newsgroups_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)  
X_train, y_train = newsgroups_train.data, newsgroups_train.target  
  
# 文字特徵提取(這裡使用詞頻向量化器)  
vectorizer = CountVectorizer()  
X_train_counts = vectorizer.fit_transform(X_train)  
  
# 劃分訓練集和測試集(這裡為了簡化,直接從訓練集中劃分)  
X_train_counts, X_test_counts, y_train, y_test = train_test_split(X_train_counts, y_train, test_size=0.2, random_state=42)  
  
# 建立隨機森林分類器  
clf = RandomForestClassifier(n_estimators=100, random_state=42)  
  
# 訓練模型  
clf.fit(X_train_counts, y_train)  
  
# 預測測試集  
y_pred = clf.predict(X_test_counts)  
  
# 評估模型  
print(classification_report(y_test, y_pred

3.4 影像分類(Image Classification)

雖然隨機森林通常不直接用於原始畫素級別的影像分類(因為這種方法在處理高維資料時可能不夠高效),但我們可以使用隨機森林來分類影像特徵(如HOG、SIFT、SURF等描述符)或者從預訓練的深度學習模型中提取的特徵。

以下是一個簡化的例子,假設我們已經有了一個包含影像特徵和對應標籤的資料集。

from sklearn.model_selection import train_test_split  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import classification_report  
import numpy as np  
  
# 假設我們已經有了一個特徵矩陣X(例如,從影像中提取的特徵)和標籤y  
# X = ... (形狀為 (n_samples, n_features) 的NumPy陣列)  
# y = ... (形狀為 (n_samples,) 的NumPy陣列)  
  
# 為了演示,我們隨機生成一些模擬資料  
n_samples = 1000  
n_features = 64  # 假設每個影像被表示為一個64維的特徵向量  
X = np.random.rand(n_samples, n_features)  
y = np.random.randint(0, 2, n_samples)  # 二分類問題  
  
# 劃分訓練集和測試集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 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(y_test, y_pred))

3.5 特徵重要性評估(Feature Importance Evaluation)

隨機森林不僅可以用於分類和迴歸任務,還可以用來評估特徵的重要性。這對於特徵選擇和解釋模型結果非常有用。

# 使用之前的鳶尾花資料集示例  
# ...(載入資料、劃分訓練集和測試集、訓練模型的程式碼)  
  
# 獲取特徵重要性  
importances = clf.feature_importances_  
std = np.std([tree.feature_importances_ for tree in clf.estimators_], axis=0)  
indices = np.argsort(importances)[::-1]  
  
# 列印特徵排名  
print("Feature ranking:")  
  
for f in range(X.shape[1]):  
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))  
  
# 我們可以使用這些特徵重要性來繪製條形圖,或者根據重要性選擇或排除某些特徵

以上程式碼示例展示了隨機森林在不同場景下的應用,包括分類、迴歸、特徵重要性評估等。注意,這些示例中的資料和特徵都是模擬的或簡化的,實際應用中我們需要根據自己的資料集和任務來調整程式碼。

3.6 異常檢測(Outlier Detection)

隨機森林也可以用於異常檢測或離群點檢測。透過構建隨機森林模型並計算每個樣本到其葉節點的平均距離(例如,使用孤立森林 Isolation Forest),我們可以識別出與大多數樣本不同的異常點。

以下是一個使用sklearn-extensions庫中的IsolationForest進行異常檢測的示例(注意:sklearn-extensions並不是scikit-learn官方庫的一部分,但提供了類似的實現):

from sklearn_extensions.ensemble import IsolationForest  
import numpy as np  
  
# 假設 X 是我們的特徵矩陣,這裡我們生成一些模擬資料  
X = np.random.normal(size=(100, 2))  
# 新增一個異常點  
X = np.r_[X + 2, np.array([[10, 10]])]  
  
# 建立 IsolationForest 例項  
clf = IsolationForest(contamination=0.1)  # 假設資料集中有10%的異常點  
  
# 擬合模型  
clf.fit(X)  
  
# 預測異常分數(分數越低,越可能是異常點)  
y_pred = clf.predict(X)  
scores = clf.decision_function(X)  
  
# 列印異常分數和預測結果  
for i, s in enumerate(scores):  
    print(f"Sample {i}: Score = {s}, Prediction = {y_pred[i]}")  
  
# 我們可以設定一個閾值來識別異常點  
threshold = -0.5  # 這個閾值需要根據我們的資料和需求來調整  
outliers = X[scores < threshold]  
print(f"Outliers: \n{outliers}")

請注意,上面的IsolationForest類可能不是scikit-learn官方庫的一部分,但我們可以使用scikit-learn中的OneClassSVMLocalOutlierFactor來實現類似的功能。

3.7 多標籤分類(Multi-label Classification)

隨機森林也可以用於多標籤分類任務,即每個樣本可能屬於多個類別。這通常透過使用多輸出分類器(multi-output classifier)來實現,該分類器為每個標籤訓練一個獨立的分類器。

from sklearn.datasets import make_multilabel_classification  
from sklearn.ensemble import RandomForestClassifier  
from sklearn.metrics import accuracy_score, precision_recall_fscore_support  
  
# 建立一個多標籤分類資料集  
X, y = make_multilabel_classification(n_samples=1000, n_features=20, n_classes=5, n_labels=2, random_state=42)  
  
# 劃分訓練集和測試集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 建立隨機森林分類器,為每個標籤訓練一個分類器  
clf = RandomForestClassifier(n_estimators=100, random_state=42)  
  
# 訓練模型  
clf.fit(X_train, y_train)  
  
# 預測測試集  
y_pred = clf.predict(X_test)  
  
# 計算每個標籤的精度、召回率和F1分數  
precision, recall, fscore, support = precision_recall_fscore_support(y_test, y_pred, average=None)  
  
# 列印結果  
for i in range(y.shape[1]):  
    print(f"Label {i}: Precision = {precision[i]}, Recall = {recall[i]}, F1 Score = {fscore[i]}")  
  
# 注意:對於多標籤分類,通常不計算整體的準確率,因為標籤之間可能是獨立的

這些示例展示了隨機森林在多種不同場景下的應用,包括異常檢測、多標籤分類等。在實際應用中,我們可能需要根據具體任務和資料集調整模型的引數和配置。

相關文章