✅博主简介:本人擅长数据处理、建模仿真、程序设计、论文写作与指导,项目与课题经验交流。项目合作可私信或扫描文章底部二维码。
提出了一种基于先验卡方原理的混合特征选择算法的极端随机森林模型(GSR-ERF模型),用于二手房价预测。通过对二手房数据进行清洗、特征选择以及极端随机森林算法的超参数优化,提升了模型的预测准确度。以下是系统的实现流程以及关键的Python代码示例。
1. 数据预处理
1.1 数据采集与清洗
首先通过Python爬虫获取大连市2022年二手房数据。数据清洗主要包括去除重复数据、处理缺失值和异常值等。
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv('dalian_house_data.csv')
# 数据清洗
df.drop_duplicates(inplace=True) # 去重
df.fillna(df.mean(), inplace=True) # 填补缺失值
1.2 特征工程
在特征工程中,使用了基于先验卡方原理的混合特征选择算法,结合遗传算法、模拟退火算法和交叉验证递归消除法,挑选出最优的特征子集。
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
# 使用卡方检验进行特征选择
X = df.drop('price', axis=1) # 预测特征
y = df['price'] # 目标值
# 使用卡方检验选择前10个重要特征
selector = SelectKBest(score_func=chi2, k=10)
X_new = selector.fit_transform(X, y)
# 输出选择的特征
selected_features = X.columns[selector.get_support()]
print("Selected features:", selected_features)
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
# 使用卡方检验进行特征选择
X = df.drop('price', axis=1) # 预测特征
y = df['price'] # 目标值
# 使用卡方检验选择前10个重要特征
selector = SelectKBest(score_func=chi2, k=10)
X_new = selector.fit_transform(X, y)
# 输出选择的特征
selected_features = X.columns[selector.get_support()]
print("Selected features:", selected_features)
2. 极端随机森林模型(ERF)
极端随机森林(ERF)是一种基于随机森林的变种算法,采用完全随机划分来生成决策树,从而增加模型的随机性。为了进一步提高模型性能,本文基于Hyperopt进行超参数优化。
2.1 Hyperopt超参数优化
Hyperopt是一种基于随机搜索和贝叶斯优化的超参数优化技术,可以自动选择最优超参数配置。我们将其应用到极端随机森林模型上,优化树的数量、最大深度、最小样本分裂等参数。
from sklearn.ensemble import ExtraTreesRegressor
from hyperopt import hp, fmin, tpe, Trials
from sklearn.model_selection import cross_val_score
# 定义搜索空间
space = {
'n_estimators': hp.choice('n_estimators', range(50, 300)),
'max_depth': hp.choice('max_depth', range(5, 20)),
'min_samples_split': hp.uniform('min_samples_split', 0.01, 0.1),
'min_samples_leaf': hp.uniform('min_samples_leaf', 0.01, 0.1),
}
# 定义目标函数
def objective(params):
model = ExtraTreesRegressor(**params)
score = cross_val_score(model, X_new, y, scoring='r2', cv=5).mean()
return -score
# 优化器
trials = Trials()
best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100, trials=trials)
print("Best parameters:", best)