第L6周:机器学习-随机森林(RF)

目标
1.什么是随机森林(RF)
随机森林(Random Forest, RF)是一种由 决策树 构成的 集成算法 ,采用的是 Bagging 方法,他在很多情况下都能有不错的表现。其是由很多决策树构成的,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。个人理解:就是通过不维度去使用决策树去分类,每个决策树都有自己的分类结果 ,再把所有的结果进行统计,得出分类最多的那个分类就是预测的最终结果 。
2. Bagging方法:Bagging的主要思想如下图所示,首先从数据集中采样出T个数据集,然后基于这T个数据集,每个训练出一个基分类器,再讲这些基分类器进行组合做出预测。Bagging在做预测时,对于分类任务,使用简单的投票法。对于回归任务使用简单平均法。若分类预测时出现两个类票数一样时,则随机选择一个。
image.png
3.目标:从一个天气数据集去推送天气情况

实验三 房价回归 下面通过本次实验介绍一个机器学习中常用的数据预测分析的实例: 该实验使用kc_house_data数据集,该数据集包含包括西雅图在内的金县的房屋销售价格。其中包括2014年5月至2015年5月间出售的房屋。这是一个评估简单回归模型的绝佳数据集。 我们可以依据房屋的属性信息,包括房屋的卧室数量、卫生间数量、房屋的大小、房屋地下室的大小、房屋的外观、房屋的评分、房屋的修建时间、房屋的翻修时间、房屋的位置信息等,对房屋的价格进行预测。 本实验会使用到的python工具包如下,请各位同学提前部署实验环境: Pip更新: Python -m pip install --upgrade pip Sklearn安装: Python -m pip install scikit-learn matplotlib安装: Python -m pip install matplotlib pandas安装: Python -m pip install pandas seaborn安装: Python -m pip install seaborn 1.初步数据分析 本实验所用数据可以从Kaggle官网下载:(已包含在实验包中)https://www.kaggle.com/harlfoxem/housesalesprediction?select=kc_house_data.csv 数据项说明: 第一列“销售日期”(date) 第二列“销售价格”(price):房屋交易价格,单位为美元,是目标预测值; 第三列“卧室数”(bedrooms):房屋中的卧室数目; 第四列“浴室数”(bathrooms):房屋中的浴室数目; 第五列“房屋面积”(sqft_living):房屋里的生活面积; 第六列“停车面积”(sqft_lot):停车坪的面积; 第七列“楼层数”(floors):房屋的楼层数; 第八列“房屋评分”(grade):King County房屋评分系统对房屋的总体评分; 第九列“建筑面积”(sqft_above):除了地下室之外的房屋建筑面积; 第十列“地下室面积”(sqft_basement):地下室的面积; 第十一列“建筑年份”(yr_built):房屋建成的年份; 第十二列“修复年份”(yr_renovated):房屋上次修复的年份; 第十三列"纬度"(lat):房屋所在纬度; 第十四列“经度”(long):房屋所在经度。 我们可以利用 pandas 进行初步分析,发现数据完整,没有缺失和重复的现象。原始数据为21613行x21列。 数据分析结果(图/表): 2.划分测试集和训练集,并进行标准化 因为 id 特征为顺序号,可去掉。 此外,date 特征是交易时间,应与交易价格关系不大, 也去掉。 用 sklearn.model_selection 中的 train_test_split()划分训练集和验证集。 例如:X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train) 参数: train_target:要划分的样本结果 test_size:样本的占比 random_state:随机种子 用 sklearn.preprocessing 中的 StandardScaler()对特征进行标准化。 标准化后,数据会被聚集到0围。 训练集数据个数: 测试集数据个数: 标准化结果(图): 3.初步建立模型 选择 K近邻回归、决策树回归、随机森林回归和梯度提升树回归等多个模型进行初步实验,用平均绝对误差、均方误差和 R 方值作评价指标。 各初期模型评价结果(图): 最后选择的算法是: 4.超参数调优 对梯度提升树的 losss、learning_rate 和 min_samples_leaf 三个超参数分别设置搜索值,进行网格搜索。 进行调优后,再次完成建模,进行回归。并对调优前后的结果进行对比。 最终调优结果为: 调优前后回归结果对比(图): 5.特征选择 如果因为某种原因要去掉一些特征,如何来分析呢? 一些常用方法为:用 corr()函数和plot()函数可以分析特征之间以及特征和标签值之间的相关系数, 从而可以删除一些相关系数低的特征。 得到的关联度热力图: 单独分析起居室面积和价格的关系图: 单独分析房屋等级面积和价格的关系图: 单独分析邮政编码和价格的关系图: 经此分析,应去掉的特征: 6.实现梯度提升树回归: 去掉无关的数据项后,使用参数调优后的梯度提升树实现回归,并评价结果。 回归结果评价数据(图): 与去除多余数据特征之前的回归结果对比: 7.使用神经网络模型进行回归 最后,尝试用全连接层神经网络来建模该回归问题, 在TensorFlow框架下实现。 tensorflow安装: Python -m pip install tensorflow (时间长,400MB以上) 示例程序采用了 4 层全连接层神经网络,中间两个隐层的节点数为 50,采用 relu 激活函数、MSE损失函数和 adam 优化算法。以每批 50 个样本进行训练 500 轮。 回归结果评价数据(图): 与梯度提升树模型的回归结果对比:
最新发布
12-26
以下是基于 kc_house_data 数据集进行房价回归实验的详细步骤及实现: ### 1. 数据加载与初步数据分析 首先需要加载数据集,并进行初步的数据分析,了解数据的基本情况。 ```python import pandas as pd # 加载数据集 data = pd.read_csv('kc_house_data.csv') # 查看数据基本信息 print('数据基本信息:') data.info() # 查看数据集行数和列数 rows, columns = data.shape # 查看数据集行数和列数 if rows < 100 and columns < 10: # 短表数据(行数少于100且列数少于10)查看全量数据信息 print('数据全部内容信息:') print(data.to_csv(sep='\t', na_rep='nan')) else: # 长表数据查看数据前几行信息 print('数据前几行内容信息:') print(data.head().to_csv(sep='\t', na_rep='nan')) ``` ### 2. 划分测试集和训练集并标准化 使用 `train_test_split` 函数划分数据集,并使用 `StandardScaler` 进行数据标准化。 ```python from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 提取特征和目标变量 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) # 数据标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) ``` ### 3. 建立多个回归模型 建立线性回归、决策树回归和随机森林回归模型。 ```python from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor # 线性回归模型 linear_model = LinearRegression() linear_model.fit(X_train_scaled, y_train) # 决策树回归模型 tree_model = DecisionTreeRegressor(random_state=42) tree_model.fit(X_train_scaled, y_train) # 随机森林回归模型 rf_model = RandomForestRegressor(random_state=42) rf_model.fit(X_train_scaled, y_train) ``` ### 4. 超参数调优 使用网格搜索对随机森林回归模型进行超参数调优。 ```python from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid = { 'n_estimators': [50, 100, 200], 'max_depth': [None, 10, 20, 30] } # 网格搜索 grid_search = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=5) grid_search.fit(X_train_scaled, y_train) # 最佳模型 best_rf_model = grid_search.best_estimator_ ``` ### 5. 特征选择 使用随机森林的特征重要性进行特征选择。 ```python import numpy as np # 获取特征重要性 importances = best_rf_model.feature_importances_ feature_names = X.columns # 选择重要特征 indices = np.argsort(importances)[::-1] top_features = feature_names[indices][:10] # 提取重要特征 X_train_top = X_train[top_features] X_test_top = X_test[top_features] # 数据标准化 scaler_top = StandardScaler() X_train_top_scaled = scaler_top.fit_transform(X_train_top) X_test_top_scaled = scaler_top.transform(X_test_top) ``` ### 6. 实现梯度提升树回归 使用 `GradientBoostingRegressor` 实现梯度提升树回归。 ```python from sklearn.ensemble import GradientBoostingRegressor # 梯度提升树回归模型 gb_model = GradientBoostingRegressor(random_state=42) gb_model.fit(X_train_top_scaled, y_train) ``` ### 7. 使用神经网络模型进行回归 使用 TensorFlow 构建简单的神经网络模型。 ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 构建神经网络模型 model = Sequential([ Dense(64, activation='relu', input_shape=(X_train_top_scaled.shape[1],)), Dense(32, activation='relu'), Dense(1) ]) # 编译模型 model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(X_train_top_scaled, y_train, epochs=10, batch_size=32, validation_split=0.1) ``` ### 8. 模型评估与对比 使用均方误差(MSE)和决定系数(R²)对各模型进行评估和对比。 ```python from sklearn.metrics import mean_squared_error, r2_score # 定义模型列表 models = [linear_model, tree_model, best_rf_model, gb_model] model_names = ['Linear Regression', 'Decision Tree Regression', 'Random Forest Regression', 'Gradient Boosting Regression'] # 遍历模型列表 for model, name in zip(models, model_names): if name == 'Random Forest Regression': y_pred = model.predict(X_train_top_scaled) else: y_pred = model.predict(X_train_scaled) mse = mean_squared_error(y_train, y_pred) r2 = r2_score(y_train, y_pred) print(f'{name} - Train MSE: {mse}, Train R²: {r2}') # 神经网络模型评估 y_pred_nn = model.predict(X_train_top_scaled) mse_nn = mean_squared_error(y_train, y_pred_nn) r2_nn = r2_score(y_train, y_pred_nn) print(f'Neural Network Regression - Train MSE: {mse_nn}, Train R²: {r2_nn}') ``` ### 总结 通过以上步骤,完成了基于 kc_house_data 数据集的房价回归实验,包括数据处理、模型建立、调优、特征选择和不同模型对比。可以根据评估结果选择最优的模型进行房价预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值