赞
踩
目录
数据源自最简数据挖掘系列,内容出售日期、卧室/浴室数量、楼层、生活面积、停车坪面积、地下室面积、建筑面积、修成年份、经纬度等等信息。数据获取见文末
字段含义
字段名 | 介绍 |
ID | 编号 |
sale_date | 房屋出售时的日期 |
num_bedroom | 房屋中的卧室数目 |
num_bathroom | 房屋中的浴室数目 |
area_house | 房屋里的生活面积 |
area_parking | 停车坪的面积 |
floor | 房屋的楼层数 |
rating | 房屋评分系统对房屋的总体评分 |
floorage | 除了地下室之外的房屋建筑面积 |
area_basement | 地下室的面积 |
year_built | 房屋建成的年份 |
year_repair | 房屋上次修复的年份 |
latitude | 房屋所在纬度 |
longitude | 房屋所在经度 |
price | 待预测值,房屋交易价格,单位为万美元 |
直方图如下,大多集中在10-100万美元之间,小部分在100-300万美元之间
根据相关系数矩阵可以明显看出,area_house、rating、floorage三个变量和房价线性相关性较强,因此可以根据散点分布图来查看这些关系
散点图中X轴为自变量、Y轴为房价,根据散点图来看,area_house、rating、floorage三个变量和房价均存在正相关的线性关系
- from pyecharts.charts import Scatter
- from pyecharts import options as opts
- from pyecharts.charts import EffectScatter
- from pyecharts.faker import Faker
- from pyecharts.globals import SymbolType
- def get_scatter(x,y,x_name='',y_name='price'):
- scatter=(
- Scatter(init_opts=opts.InitOpts(width="700px", height="450px"))
- .add_xaxis(xaxis_data=x)
- .add_yaxis(
- series_name=x_name,
- y_axis=y,
- symbol_size=10,
- label_opts=opts.LabelOpts(is_show=False),
- )
- .set_series_opts()
- .set_global_opts(
- xaxis_opts=opts.AxisOpts(
- type_="value", splitline_opts=opts.SplitLineOpts(is_show=True),
- # name="area_house",
- axislabel_opts=opts.LabelOpts(font_size=13, color="black"),
- name_textstyle_opts=opts.TextStyleOpts(
- font_size=15, # 字体大小
- color="#333" # 字体颜色
- ),
- ),
-
- yaxis_opts=opts.AxisOpts(
- type_="value",
- axistick_opts=opts.AxisTickOpts(is_show=True),
- splitline_opts=opts.SplitLineOpts(is_show=True),
- # name="price",
- axislabel_opts=opts.LabelOpts(font_size=13, color="black"),
- name_textstyle_opts=opts.TextStyleOpts(
- font_size=15, # 字体大小
- color="#333" # 字体颜色
- ),
-
- ),
- tooltip_opts=opts.TooltipOpts(is_show=False),
- )
- )
- return scatter
使用catboost构建回归模型,按照7:3的比例划分训练集、测试集,然后使用r方进行评估,结果如下
- from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score
- def r2_value(y_true,df,model):
- y_pred=model.predict(df)
- r2=r2_score(y_true, y_pred)
- return r2
-
- from catboost import CatBoostRegressor
- def init_params_catboost():
- params={
- 'loss_function': 'RMSE', # 损失函数,取值RMSE, Logloss, MAE, CrossEntropy, Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE, Poisson。默认Logloss。
- # 'custom_loss': 'F1', # 训练过程中计算显示的损失函数,取值Logloss、CrossEntropy、Precision、Recall、F、F1、BalancedAccuracy、AUC等等
- 'eval_metric': 'RMSE', # 用于过度拟合检测和最佳模型选择的指标,取值范围同custom_loss
- 'iterations': 1300, # 最大迭代次数,默认500. 别名:num_boost_round, n_estimators, num_trees
- 'learning_rate': 0.15, # 学习速率,默认0.03 别名:eta
- 'random_seed': 123, # 训练的随机种子,别名:random_state
- 'l2_leaf_reg': 0, # l2正则项,别名:reg_lambda
- 'bootstrap_type': 'Bernoulli', # 确定抽样时的样本权重,取值Bayesian、Bernoulli(伯努利实验)、MVS(仅支持cpu)、Poisson(仅支持gpu)、No(取值为No时,每棵树为简单随机抽样);默认值GPU下为Bayesian、CPU下为MVS
- # 'bagging_temperature': 0, # bootstrap_type=Bayesian时使用,取值为1时采样权重服从指数分布;取值为0时所有采样权重均等于1。取值范围[0,inf),值越大、bagging就越激进
- 'subsample': 0.6, # 样本采样比率(行采样)
- 'sampling_frequency': 'PerTree', # 采样频率,取值PerTree(在构建每棵新树之前采样)、PerTreeLevel(默认值,在子树的每次分裂之前采样);仅支持CPU
- 'use_best_model': True, # 让模型使用效果最优的子树棵树/迭代次数,使用验证集的最优效果对应的迭代次数(eval_metric:评估指标,eval_set:验证集数据),布尔类型可取值0,1(取1时要求设置验证集数据)
- 'best_model_min_trees': 2000, # 最少子树棵树,和use_best_model一起使用
- 'depth': 6, # 树深,默认值6
- 'grow_policy': 'SymmetricTree', # 子树生长策略,取值SymmetricTree(默认值,对称树)、Depthwise(整层生长,同xgb)、Lossguide(叶子结点生长,同lgb)
- 'min_data_in_leaf': 10, # 叶子结点最小样本量
- # 'max_leaves': 12, # 最大叶子结点数量
- 'one_hot_max_size': 4, # 对唯一值数量<one_hot_max_size的类别型特征使用one-hot编码
- 'rsm': 0.6, # 列采样比率,别名colsample_bylevel 取值(0,1],默认值1
- 'nan_mode': 'Max', # 缺失值处理方法,取值Forbidden(不支持缺失值,输入包含缺失时会报错)、Min(处理为该列的最小值,比原最小值更小)、Max(同理)
- 'input_borders': None, # 特征数据边界(最大最小边界)、会影响缺失值的处理(nan_mode取值Min、Max时),默认值None、在训练时特征取值的最大最小值即为特征值边界
- 'boosting_type': 'Ordered', # 提升类型,取值Ordered(catboost特有的排序提升,在小数据集上效果可能更好,但是运行速度较慢)、Plain(经典提升)
- 'max_ctr_complexity': 2, # 分类特征交叉的最高阶数,默认值4
- 'logging_level':'Silent', # 模型训练过程的信息输出等级,取值Silent(不输出信息)、Verbose(默认值,输出评估指标、已训练时间、剩余时间等)、Info(输出额外信息、树的棵树)、Debug(debug信息)
- 'metric_period': 1, # 计算目标值、评估指标的频率,默认值1、即每次迭代都输出目标值、评估指标
- 'early_stopping_rounds': 2000,
- 'border_count': 1000, # 数值型特征的分箱数,别名max_bin,取值范围[1,65535]、默认值254(CPU下), # 设置提前停止训练,在得到最佳的评估结果后、再迭代n(参数值为n)次停止训练,默认值不启用
- 'feature_border_type': 'GreedyLogSum', # 数值型特征的分箱方法,取值Median、Uniform、UniformAndQuantiles、MaxLogSum、MinEntropy、GreedyLogSum(默认值)
- }
- return params
-
- def catboost_model(df,y_name,model_fea,cate_col=[]):
-
- x_train,x_test, y_train, y_test =train_test_split(df[model_fea],df[y_name],test_size=0.3,random_state=2)
-
- params=init_params_catboost()
- model = CatBoostRegressor(**params)
- model.fit(x_train, y_train,eval_set=[(x_train, y_train),(x_test,y_test)],cat_features=cate_col)
-
- train_r2=r2_value(y_train,x_train,model)
- test_r2=r2_value(y_test,x_test,model)
-
- model_result={
- 'train':y_train.count(),
- 'test':y_test.count(),
- 'all':df.shape[0],
- 'train_r2':train_r2,
- 'test_r2':test_r2
- }
- return model_result,model
-
- model_result,model=catboost_model(df,'price',fea_list)
- model_result
关注威信公众号 Python风控模型与数据分析,回复 房价预测 获取本篇数据及代码
还有更多理论、代码分享等你来拿
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。