随机森林实例——鸢尾花分类和房价预测

一、引言

  本篇主要介绍机器学习里的一种重要算法 —— 随机森林(Randon Forest),该算法很灵活、使用起来方便,甚至不需要超参数superparameter)来调优。

二、什么是随机森林?

  1.集成学习(ensemble learning)

  随机森林是基于集成学习(ensemble learning)的思想,这是机器学习算法中的一种重要思想,可以理解成集思广益。核心思想为:生成一组“个体学习器”(这可以是决策树、神经网络等),然后以某种策略把这些学习器结合起来,达到减少错误,提高精度的效果。这就像向一群专家征求意见,而不是只依靠一个人。每个专家都可能犯错误,但当你把他们的知识结合起来时,最终的决定往往会更好、更准确。

  2.随机森林(random forest)

  生成一组决策树,将不同决策树的结果结合后输出。随机提现在每次数据集随机有放回的选出,同时随机选出部分特征作为输入;许多决策树结合在一起,所谓“森林”,所以该算法被称为随机森林算法。随机森林算法是以决策树为估计器的Bagging算法。随机森林可以用于分类问题(classification)回归问题(regression)

在这里插入图片描述

3. 编程实现

1) 分类问题(鸢尾花分类

load_iris 数据集:

  数据集包括两个属性data和target,150条记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度等4个用于识别鸢尾花(iris)的属性,第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。我们通过判定花萼长度,花萼宽度,花瓣长度和花瓣宽度来划分鸢尾花的类别。

编程实现:

# 导入必要的库
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.3, random_state=42)

# 创建随机森林分类器实例
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf_clf.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = rf_clf.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的准确率为: {accuracy:.2f}")

2) 回归问题(以房价预测问题为例

数据说明:

   衡量房价的指标有:price, area, bedrooms, bathrooms, stories, mainroad, guestroom, basement, hotwaterheating, airconditioning, parking, prefarea, furnishingstatus。部分数据如图:在这里插入图片描述
  由于有些属性非数值型,需要转换。如yes - 1,no - 0。furnishingstatus有三种状态,furnished - 2,semi-furnished - 1,unfurnished - 0。

编程实现:

导入模块:
import pandas as ps
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.preprocessing import LabelEncoder

  主要用到pandas和sklearn。pandas主要用于数据分析。
  sklearn主要用于机器学习。在 Sklearn 里有六大任务模块,分别是分类、回归、聚类、降维、模型选择和预处理。
sklearn模块介绍:
  1. model_selection,用于模型选择,比如交叉验证(cross validation) 和超参数调优( hyper-parameter tuning)。
在这里插入图片描述
  2. ensemble: Ensemble-based methods for classification, regression and anomaly detection.
  3. metrics里面有各种评价指标函数,如回归指标 explained_variance_score, mean_absolute_error, mean_squared_error, r2_score etc. 分类指标 accuracy_score, precision_score等。
  4. preprocessing,数据预处理。

sklearn相关库的官方链接如下:
  sklearn.model_selection
  sklearn.ensemble
  sklearn.metrics
  sklearn.preprosessing

数据导入和预处理:

  标签转数值:

# 加载数据
file_path = r'youFilePath'
data = pd.read_csv(file_path)

# 数据预处理
# 将二值属性转换为数值(yes - 1, no - 0
label_encoder = LabelEncoder()
binary_columns = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning','prefarea']
for column in binary_columns:
    data[column] = label_encoder.fit_transform(data[column].map({'yes': 1, 'no': 0}))

# 将furnishingstatus属性转换为数值(furnished: 2 semi-furnished: 1 unfurnished - 0
data['furnishingstatus'] = label_encoder.fit_transform(data['furnishingstatus'].map({'furnished': 2, 'semi-furnished': 1, 'unfurnished': 0}))

"""
这里的转换也可以不使用 labelEncoder,可以直接 map ,比如:
data['furnishingstatus'] = data['furnishingstatus'].map({'furnished': 2, 'semi-furnished': 1, 'unfurnished': 0})
两种方法都能把分类标签转换成数值,效果是一样的。

区别:
1. labelEncoder 保留了映射关系,可以反向转换,机器学习常用。没有 label_encoder 就只能做单向映射。
2. labelEncoder 会给每一个标签都赋值,即使标签不存在(不存在的标签 labelEnconder 会给一个新的整数值)。直接 map 的话,没有在映射字典中的值会被赋为 NaN。
"""
训练随机森林模型:
# 特征和目标变量
X = data.drop('price', axis=1) # 删去 price 这一列,axis 指 price 的位置
y = data['price']

# 标准化
""" sklearn有自带标准化器 """
""" 
# 初始化标准化器
scaler = StandardScaler()
# 计算均值和标准差,并转换数据
standardized_data = scaler.fit_transform(data)
"""
# 这里我自定义最小-最大标准化函数进行标准化。也可以使用sklearn的内置函数
def min_max_scaling(X, feature_range=(0, 1)):
    X_min = X.min()
    X_max = X.max()
    X_scaled = (X - X_min) / (X_max - X_min) * (feature_range[1] - feature_range[0]) + feature_range[0]
    return X_scaled
   
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 标准化训练集和测试集数据
X_train_scaled = min_max_scaling(X_train)
X_test_scaled = min_max_scaling(X_test)
Y_train_scaled = min_max_scaling(y_train)
Y_test_scaled = min_max_scaling(y_test)

# 创建随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=42)

# 训练模型
model.fit(X_train_scaled, Y_train_scaled)

模型预测和评估:
# 预测
y_pred = model.predict(X_test_scaled)

# 模型评估
# mse 均方误差
mse = mean_squared_error(Y_test_scaled, y_pred)
print(f'Mean Squared Error: {mse}')

# R^2 可决系数
r2 = r2_score(Y_test_scaled,y_pred)
print(f'R^2: {r2}')
训练结果可视化
# 可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.plot(range(len(y_test_scaled)), y_test_scaled, label='Actual', marker='o', linestyle='-')
plt.plot(range(len(y_pred)), y_pred, label='Predicted', marker='s', linestyle='--')
plt.xlabel('Data Index')
plt.ylabel('Scaled Price')
plt.title('Actual vs Predicted Prices')
plt.legend()
plt.show()

完整代码:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.preprocessing import LabelEncoder,MinMaxScaler

# 加载数据
file_path = r'your_file_path'
data = pd.read_csv(file_path)

# 数据预处理
# 将二值属性转换为数值(yes - 1, no - 0
label_encoder = LabelEncoder()
binary_columns = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning','prefarea']
for column in binary_columns:
    data[column] = label_encoder.fit_transform(data[column].map({'yes': 1, 'no': 0}))

# 将furnishingstatus属性转换为数值(furnished: 2 semi-furnished: 1 unfurnished - 0
data['furnishingstatus'] = label_encoder.fit_transform(data['furnishingstatus'].map({'furnished': 2, 'semi-furnished': 1, 'unfurnished': 0}))

# 特征和目标变量
X = data.drop('price', axis=1) # 删去 price 这一列,axis 指 price 的位置
y = data['price']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

""" 用sklearn自带的标准化器 """
# 标准化
scaler_X, scaler_y = MinMaxScaler(), MinMaxScaler()
X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)
y_train_scaled = scaler_y.fit_transform(y_train.values.reshape(-1, 1)).ravel()
y_test_scaled = scaler_y.transform(y_test.values.reshape(-1, 1)).ravel()

# 创建随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=42)

# 训练模型
model.fit(X_train_scaled, y_train_scaled)

# 预测
y_pred = model.predict(X_test_scaled)

# 模型评估
# mse
mse = mean_squared_error(y_test_scaled, y_pred)
print(f'Mean Squared Error: {mse}')

# R^2
r2 = r2_score(y_test_scaled,y_pred)
print(f'R^2: {r2}')

# 输出特征重要性
feature_importances = model.feature_importances_
importance_df = pd.DataFrame({'Feature': X.columns, 'Importance': feature_importances}).sort_values(by='Importance', ascending=False)
print(importance_df.to_string(index=False))

# 可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.plot(range(len(y_test_scaled)), y_test_scaled, label='Actual', marker='o', linestyle='-')
plt.plot(range(len(y_pred)), y_pred, label='Predicted', marker='s', linestyle='--')
plt.xlabel('Data Index')
plt.ylabel('Scaled Price')
plt.title('Actual vs Predicted Prices')
plt.legend()
plt.show()

参考文章:
Random Forest Algorithm in Machine Learning
Ensemble Learning

<think>好的,用户需要关于随机森林模型的示例代码实现方法。首先,我需要回忆一下随机森林的基本概念,它是一个集成学习算法,通过组合多个决策树来提高模型的准确性鲁棒性。用户提到他们想寻找实例或示例代码,所以应该重点提供具体的代码示例步骤。 接下来,我需要查看用户提供的引用内容,看看是否有相关的代码或信息可以利用。引用[1]提到使用Scikit-learn库实现随机森林,并提供了示例代码,包括数据准备、训练、评估预测。引用[2]提到使用feature_importances_函数输出特征重要性。引用[4]讨论了决策树随机森林的信息熵基础。这些信息都是有用的,可以整合到回答中。 首先,我应该确定用户可能使用的编程语言。引用[1][2]是Python的示例,引用[3]是关于Java的,但用户的问题中没有特别指定语言,不过引用的示例主要是Python,所以优先考虑Python的代码。 然后,我需要构建一个完整的示例流程,包括数据准备、模型训练、评估、预测特征重要性分析。使用Scikit-learn库是标准做法,所以示例代码应该基于这个库。 在数据准备部分,可能需要使用一个内置的数据集,比如鸢尾花数据集,这样用户可以直接运行代码而不需要处理外部数据。接着是导入随机森林分类器,划分训练集测试集,训练模型,进行预测,最后评估模型准确率使用特征重要性。 同时,需要确保代码格式正确,符合用户提到的系统级指令,比如使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。但在这个回答中,可能数学公式较少,但如果有的话需要注意格式。 用户可能还需要了解随机森林的基本原理,但根据问题,他们主要需要示例代码,所以重点放在代码实现上,简要解释步骤即可。 另外,用户提到生成相关问题,所以需要根据内容提出几个相关问题,例如优化方法、参数调优、应用场景等。 最后,检查引用标注是否正确,确保每个引用的末尾都有对应的标识,并且引用内容与回答中的信息对应。</think>### 随机森林模型示例代码与实现步骤 随机森林是一种基于决策树的集成学习算法,通过构建多棵树并结合其预测结果来提高模型的准确性鲁棒性[^4]。以下是使用Python中Scikit-learn库实现随机森林模型的完整示例: #### 1. 数据准备 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载鸢尾花数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集测试集(7:3比例) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` #### 2. 模型训练 ```python from sklearn.ensemble import RandomForestClassifier # 初始化随机森林分类器(100棵决策树) rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) ``` #### 3. 模型评估 ```python from sklearn.metrics import accuracy_score # 预测测试集 y_pred = rf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率:{accuracy:.2f}") # 示例输出:模型准确率:0.98 ``` #### 4. 特征重要性分析 ```python import pandas as pd # 输出特征重要性 feature_importances = pd.DataFrame({ "特征": iris.feature_names, "重要性": rf.feature_importances_ }).sort_values("重要性", ascending=False) print("特征重要性排序:") print(feature_importances) ``` #### 代码说明 - `n_estimators=100` 表示使用100棵决策树构建森林,树的数量越多模型越稳定,但计算成本增加[^1] - `random_state=42` 保证实验可重复性 - 特征重要性通过基尼不纯度减少量计算,值越大表示该特征对分类贡献越大[^2] --- ### 核心原理简析 随机森林通过以下步骤实现分类: 1. **自助采样(Bootstrap)**:从训练集中有放回地随机抽取样本 2. **随机特征选择**:每棵树在分裂时仅考虑部分特征(如$\sqrt{\text{特征总数}}$) 3. **多数表决机制**:所有决策树的预测结果通过投票产生最终结果 数学表达为: $$ \hat{y} = \text{mode}\{ h_1(x), h_2(x), ..., h_B(x) \} $$ 其中$B$为树的总数,$h_b(x)$为单棵树的预测结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值