【问题4】:kaggle练习题《自行车租赁业务预测》--带数据分析,用了随机森林,支持向量机,岭回归等

不念不忘少年蓝@ 2022-03-19 02:08 154阅读 0赞

数据来源:https://www.kaggle.com/c/bike-sharing-demand

第一步:读取数据 并对数据进行分析

  1. import numpy as np
  2. import pandas as pd
  3. df_train = pd.read_csv('data/kaggle_bike_competition_train.csv')
  4. print(df_train.head())
  5. print(df_train.shape)
  6. print(df_train.dtypes) # 看一下各字段类型
  7. # 看时候有缺失值
  8. print(df_train.isnull().sum().sum()) # 输出为0,表示没有缺失值
  9. 读取出来的数据 下面这个表columns名与数据错一位。 datetime对应的是日期那一列,第一列是序号。






























































































datetime season holiday workingday weather temp atemp humidity windspeed casual registered count
0 2011-01-01 00:00:00 1 0 0 1 9.84 14.395 81 0.0000 3 13 16
1 2011-01-01 01:00:00 1 0 0 1 9.02 13.635 80 0.0000 8 32 40
2 2011-01-01 02:00:00 1 0 0 1 9.02 13.635 80 0.0000 5 27 32
3 2011-01-01 03:00:00 1 0 0 1 9.84 14.395 75 0.0000 3 10 13
4 2011-01-01 04:00:00 1 0 0 1 9.84 14.395 75 0.0000 0 1 1
  1. 从上面得出了各字段的类型,并且得出没有缺失值。。。因为最后一行代码输出为0.
  2. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70][]

第二步:处理一些字段 如:datetime那一列。

  1. # 把月,日和小时单独拎出来,搞成三列
  2. df_train['month'] = pd.DatetimeIndex(df_train.datetime).month
  3. df_train['day'] = pd.DatetimeIndex(df_train.datetime).dayofweek
  4. df_train['hour'] = pd.DatetimeIndex(df_train.datetime).hour
  5. # print(df_train.head())
  6. # 那个,既然时间大串已经被我们处理过了,那这个字段放着太占地方,干脆就不要了吧
  7. # 先上一个粗暴的版本,咱们把注册租户和未注册租户也先丢掉,回头咱们再看另外一种处理方式
  8. # 保险起见,保存一下刚才处理的数据
  9. df_train_origin = df_train
  10. # 删除掉不需要的字段
  11. df_train = df_train.drop(['datetime', 'casual', 'registered'], axis=1)
  12. # print(df_train.head()) # 查看处理后的数据
  13. # print(df_train.shape) # 显然列变为了12
  14. # 开始分数据 count是标签
  15. df_train_target = df_train['count'].values
  16. df_train_data = df_train.drop(['count'], axis=1).values
  17. 这一步我们将日期拆开,分别增加三列:month, day, hour 并且把注册租户和未注册租户以及原先datetime列删除 。。防止他们干扰。 最后得出 特征值和标签值。

第三步:模型走起

  1. **1. 岭回归**
  2. print("岭回归\n")
  3. kfold = KFold(n_splits=3, shuffle=True, random_state=42)
  4. for train, test in kfold.split(df_train_data):
  5. clf = Ridge()
  6. clf.fit(df_train_data[train], df_train_target[train])
  7. print("训练集准确率:{},测试集准确率:{}".format(
  8. clf.score(df_train_data[train], df_train_target[train]),
  9. clf.score(df_train_data[test], df_train_target[test])
  10. ))
  11. 先进行3折交叉验证,然后用岭回归进行训练。 最后得出的结果很尴尬

2019021416000947.png

2.支持向量机模型

  1. print("支持向量机\n")
  2. for train, test in kfold.split(df_train_data):
  3. clf = SVR(kernel='rbf', C=10, gamma=0.001)
  4. clf.fit(df_train_data[train], df_train_target[train])
  5. print("训练集准确率:{},测试集准确率:{}".format(
  6. clf.score(df_train_data[train], df_train_target[train]),
  7. clf.score(df_train_data[test], df_train_target[test])
  8. ))

结果:

2019021416073719.png

这个结果也挺尴尬 。 支持向量机曾几何时也是神器。

3.随机森林

  1. print("随机森林\n")
  2. for train, test in kfold.split(df_train_data):
  3. clf = RandomForestRegressor(n_estimators=80)
  4. clf.fit(df_train_data[train], df_train_target[train])
  5. print("训练集准确率:{},测试集准确率:{}".format(
  6. clf.score(df_train_data[train], df_train_target[train]),
  7. clf.score(df_train_data[test], df_train_target[test])
  8. ))

结果还是不错的。

20190214161103691.png

  1. **4.用网格搜索给随机森林找一组参数,然后在用随机森林预测**
  2. x_train, x_test, y_train, y_test = train_test_split(df_train_data, df_train_target, test_size=0.2, random_state=42)
  3. params = {"n_estimators": [30, 60, 90]}
  4. scores = ['r2']
  5. for score in scores:
  6. print(score)
  7. clf = GridSearchCV(RandomForestRegressor(), params, cv=5, scoring=score)
  8. clf.fit(x_train, y_train)
  9. print(clf.best_estimator_)

找到了一组合适的参数。如下

20190214161518647.png

我们用这组参数再次进行随机森林预测

  1. print("随机森林\n")
  2. for train, test in kfold.split(df_train_data):
  3. clf = RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
  4. max_features='auto', max_leaf_nodes=None,
  5. min_impurity_decrease=0.0, min_impurity_split=None,
  6. min_samples_leaf=1, min_samples_split=2,
  7. min_weight_fraction_leaf=0.0, n_estimators=90, n_jobs=None,
  8. oob_score=False, random_state=None, verbose=0, warm_start=False)
  9. clf.fit(df_train_data[train], df_train_target[train])
  10. print("训练集准确率:{},测试集准确率:{}".format(
  11. clf.score(df_train_data[train], df_train_target[train]),
  12. clf.score(df_train_data[test], df_train_target[test])
  13. ))

20190214163519236.png

附加: 走一波数据分析

画出几个特征与流通量的关系

  1. # 风速与流通量
  2. df_train_origin.groupby('windspeed').mean().plot(y='count', marker='o')
  3. plt.show()
  4. # 湿度与流通量
  5. df_train_origin.groupby('humidity').mean().plot(y='count', marker='o')
  6. plt.show()
  7. # 温度与流通量
  8. df_train_origin.groupby('temp').mean().plot(y='count', marker='o')
  9. plt.show()
  10. # 温度湿度变化
  11. df_train_origin.plot(x='temp', y='humidity', kind='scatter')
  12. plt.show()

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 3

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 4

画出各个维度与count的关系

  1. fig, axs = plt.subplots(nrows=2, ncols=3)
  2. df_train_origin.plot(kind='scatter', x='temp', y='count', ax=axs[0, 0], figsize=(16, 8), color='magenta')
  3. df_train_origin.plot(kind='scatter', x='atemp', y='count', ax=axs[0, 1], color='cyan')
  4. df_train_origin.plot(kind='scatter', x='humidity', y='count', ax=axs[0, 2], color='red')
  5. df_train_origin.plot(kind='scatter', x='windspeed', y='count', ax=axs[1, 0], color='yellow')
  6. df_train_origin.plot(kind='scatter', x='month', y='count', ax=axs[1, 1], color='blue')
  7. df_train_origin.plot(kind='scatter', x='hour', y='count', ax=axs[1, 2], color='green')
  8. plt.show()

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 5

画出各个特征之间的相关性

  1. corr = df_train_origin[['temp', 'weather', 'windspeed', 'day', 'month', 'hour', 'count']].corr()
  2. print(corr)
  3. # 用颜色深浅来表示相关度
  4. plt.matshow(corr)
  5. plt.colorbar()
  6. plt.show()

相关性矩阵 带负号表示负相关

20190214164451611.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYXdyb2FkODg_size_16_color_FFFFFF_t_70 6 由上向下,相关性一次减小。。

本次就分析到这里 。。。未完待续 连载中。。。。

发表评论

表情:
评论列表 (有 0 条评论,154人围观)

还没有评论,来说两句吧...

相关阅读