kaggle自行车租赁预测

kaggle自行车租赁预测

1.数据

字段介绍:
datetime    日期(年月日时分秒)
season      季节。1为春季,2为夏季,3为秋季,4为冬季
hodliday    是否为假期。1代表是,0代表不是
workingday  是否为工作日。1代表是,0代表不是。
weather     天气。1天气晴朗或多云,2有雾和云/峰等,3小雪/小雨,闪电及多云。4大雨/冰雹/闪电和大雾/大雪。
temp        摄氏温度
atemp       人们感觉的温度
humidity    湿度
windspeed   风速
casual      没有注册的预定自行车的人数
registered  注册了的预定自行车的人数
count       总租车人数
#最后三个字段3个不属于特征

2.数据预处理

  • 通过pandas导入数据

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    #pandas数据读入
    df_train = pd.read_csv("kaggle_bike_competition_train.csv",header=0)
  • 瞅一眼看看数据格式,这里打印前5行:
    df_train.head(5)

  • 查看一下数据有没有缺省值
    print(df_train.shape)
    # 看看有没有缺省值
    print(df_train.count())
    """
    (10886, 12)
    datetime      10886
    season        10886
    holiday       10886
    workingday    10886
    weather       10886
    temp          10886
    atemp         10886
    humidity      10886
    windspeed     10886
    casual        10886
    registered    10886
    count         10886
    dtype: int64
    """
  • 把月,日和小时单独拎出来放到df_train中:
    df_train['month'] = pd.DatetimeIndex(df_train.datetime).month
    df_train['day'] = pd.DatetimeIndex(df_train.datetime).dayofweek
    df_train['hour'] = pd.DatetimeIndex(df_train.datetime).hour
  • 将不属于特征的字段去掉,这里是datetime,casual,registered
    #datetime 通过上一步拆分月,日,时更加形象
    #casual,registered为目标预测数据
    df_train = df_train.drop(['datetime','casual','registered'],axis=1)
  • 再查看数据
    df_train.head(5)

  • 将数据分为2个部分:
    • 1.df_train_target:目标,也就是count字段
    • 2.df_train_data:用于产生特征的数据

3.特征工程

  • 下面的过程会让你看到,其实应用机器学习算法的过程,多半是在调参,各种不同的参数会带来不同的结果(比如正则化系数,比如决策树类的算法的树深和颗树,比如距离判定准则等等等)
  • 我们使用交叉验证的方式(交叉验证集约占全部数据的20%)来看看模型效果,使用以上三个模型,都跑3趟,看看它们平均值评分结果:
    from sklearn import linear_model#岭回归
    from sklearn import model_selection
    from sklearn import svm#向量回归
    from sklearn.ensemble import RandomForestRegressor#随机森林回归包
    from sklearn.model_selection import learning_curve
    from sklearn.model_selection import GridSearchCV
    from sklearn.metrics import explained_variance_score
    # 切分数据(训练集和测试集)
    cv = model_selection.ShuffleSplit(n_splits=3,test_size=0.2,random_state=0)
    cv_split = cv.split(df_train_data)
    print("岭回归")
    for train,test in cv_split:
        svc = linear_model.Ridge().fit(df_train_data[train], df_train_target[train])
        print("train score: {0:.3f}, test score: {1:.3f}\n".format(
            svc.score(df_train_data[train], df_train_target[train]),
            svc.score(df_train_data[test], df_train_target[test])))
    print("支持向量回归/SVR(kernel='rbf',C=10,gamma=.001)")
    for train,test in cv.split(df_train_data):
        svc = svm.SVR(kernel ='rbf', C = 10, gamma = .001).fit(df_train_data[train], df_train_target[train])
        print("train score: {0:.3f}, test score: {1:.3f}\n".format(
            svc.score(df_train_data[train], df_train_target[train]),
            svc.score(df_train_data[test], df_train_target[test])))
    print("随机森林回归/Random Forest(n_estimators = 100)")
    for train, test in cv.split(df_train_data):
        svc = RandomForestRegressor(n_estimators = 100).fit(df_train_data[train], df_train_target[train])
        print("train score: {0:.3f}, test score: {1:.3f}\n".format(
            svc.score(df_train_data[train], df_train_target[train]),
            svc.score(df_train_data[test], df_train_target[test])))
    • 结果展示:
    岭回归
    train score: 0.339, test score: 0.332
    
    train score: 0.330, test score: 0.370
    
    train score: 0.342, test score: 0.320
    
    支持向量回归/SVR(kernel='rbf',C=10,gamma=.001)
    train score: 0.417, test score: 0.408
    
    train score: 0.406, test score: 0.452
    
    train score: 0.419, test score: 0.390
    
    随机森林回归/Random Forest(n_estimators = 100)
    train score: 0.982, test score: 0.864
    
    train score: 0.982, test score: 0.880
    
    train score: 0.981, test score: 0.869

4.模型参数调整

  • 不用自己折腾,通过GridSearch,帮我们调节最佳参数

    X = df_train_data
    y = df_train_target
    
    X_train, X_test, y_train, y_test = model_selection.train_test_split(
        X, y, test_size=0.2, random_state=0)
    tuned_parameters = [{'n_estimators':[10,100,500]}]   
    
    scores = ['r2']
    
    for score in scores:
        print(score)
        clf = GridSearchCV(RandomForestRegressor(), tuned_parameters, cv=5, scoring=score)
        clf.fit(X_train, y_train)
        #best_estimator_ returns the best estimator chosen by the search
        print(clf.best_estimator_)
        print("得分分别是:")
        #grid_scores_的返回值:
        #    * a dict of parameter settings
        #    * the mean score over the cross-validation folds
        #    * the list of scores for each fold
    
        for mean_score in clf.cv_results_["mean_test_score"]:
            print("%0.3f"
                  % (mean_score,))
    #得到结果需要花费些时间
    • 结果展示
    r2
    RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
               max_features='auto', max_leaf_nodes=None,
               min_impurity_decrease=0.0, min_impurity_split=None,
               min_samples_leaf=1, min_samples_split=2,
               min_weight_fraction_leaf=0.0, n_estimators=500, n_jobs=None,
               oob_score=False, random_state=None, verbose=0, warm_start=False)
    得分分别是:
    0.846
    0.861
    0.863
  • 可视化展示,看看模型学习曲线是否过拟合或欠拟合
    
    def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                            n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):
    
        plt.figure()
        plt.title(title)
        if ylim is not None:
            plt.ylim(*ylim)
        plt.xlabel("Training examples")
        plt.ylabel("Score")
        train_sizes, train_scores, test_scores = learning_curve(
            estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
        train_scores_mean = np.mean(train_scores, axis=1)
        train_scores_std = np.std(train_scores, axis=1)
        test_scores_mean = np.mean(test_scores, axis=1)
        test_scores_std = np.std(test_scores, axis=1)
        plt.grid()
    
        plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                         train_scores_mean + train_scores_std, alpha=0.1,
                         color="r")
        plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                         test_scores_mean + test_scores_std, alpha=0.1, color="g")
        plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
                 label="Training score")
        plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
                 label="Cross-validation score")
    
        plt.legend(loc="best")
        return plt
    
    title = "Learning Curves (Random Forest, n_estimators = 100)"
    cv = model_selection.ShuffleSplit(n_splits=3,test_size=0.2,random_state=0)
    cv_split = cv.split(df_train_data)
    estimator = RandomForestRegressor(n_estimators = 100)
    plot_learning_curve(estimator, title, X, y, (0.0, 1.01), cv=cv_split, n_jobs=4)
    
    plt.show()

  • 随机森林算法学习能力比较强,由图可以发现,训练集和测试机分差较大,过拟合很明显,尝试缓解过拟合(未必成功):
    print("随机森林回归/Random Forest(n_estimators=200, max_features=0.6, max_depth=15)")
    cv = model_selection.ShuffleSplit(n_splits=6,test_size=0.2,random_state=0)
    
    for train, test in cv.split(df_train_data):
        svc = RandomForestRegressor(n_estimators = 200, max_features=0.6, max_depth=15).fit(df_train_data[train], df_train_target[train])
        print("train score: {0:.3f}, test score: {1:.3f}\n".format(
            svc.score(df_train_data[train], df_train_target[train]), svc.score(df_train_data[test], df_train_target[test])))
    • 显示结果
    随机森林回归/Random Forest(n_estimators=200, max_features=0.6, max_depth=15)
    train score: 0.965, test score: 0.868
    
    train score: 0.966, test score: 0.885
    
    train score: 0.966, test score: 0.873
    
    train score: 0.965, test score: 0.876
    
    train score: 0.966, test score: 0.869
    
    train score: 0.966, test score: 0.872

5.特征项分析:

1.温度对租车影响:

df_train_origin.groupby('temp').mean().plot(y='count', marker='o')
plt.show()

2.风速对租车影响:

df_train_origin.groupby('windspeed').mean().plot(y='count', marker='o')
plt.show()

3.湿度对租车影响

# 湿度
df_train_origin.groupby('humidity').mean().plot(y='count', marker='o')
plt.show()

4.温度与湿度变化

df_train_origin.plot(x='temp', y='humidity', kind='scatter')
plt.show()


# scatter一下各个维度
fig, axs = plt.subplots(2, 3, sharey=True)
df_train_origin.plot(kind='scatter', x='temp', y='count', ax=axs[0, 0], figsize=(16, 8), color='magenta')
df_train_origin.plot(kind='scatter', x='atemp', y='count', ax=axs[0, 1], color='cyan')
df_train_origin.plot(kind='scatter', x='humidity', y='count', ax=axs[0, 2], color='red')
df_train_origin.plot(kind='scatter', x='windspeed', y='count', ax=axs[1, 0], color='yellow')
df_train_origin.plot(kind='scatter', x='month', y='count', ax=axs[1, 1], color='blue')
df_train_origin.plot(kind='scatter', x='hour', y='count', ax=axs[1, 2], color='green')

原文地址:https://www.cnblogs.com/xujunkai/p/12116959.html

时间: 2024-08-30 12:31:20

kaggle自行车租赁预测的相关文章

Kaggle 自行车租赁预测比赛项目实现

作者:大树 更新时间:01.20 email:[email protected] 数据处理,机器学习 回主目录:2017 年学习记录和总结 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { b

公共自行车租赁无线监控系统方案

1.系统原理及特点 本系统采用无线网络传输技术进行数据统计和管理运营.系统主要有4大部分组成,后端部分包含发卡管理系统.数据库管理.短信平台和管理工作站;无线通信技术采用厦门为那通信的3G/4G ROUTER实现数据联网;前端部分主要有读卡系统主机:自行车电子标签和电子锁感应开关. 通过为那通信的工业无线路由器 WINER ROUTER实现对多站点自行车实现统一的租赁信息管理与统计.租赁计时计费.站点环境与自行车使用状态监测等功能,采用3G/4G 网络保证无线传输速率的可靠性,即能保证自行车租赁

教程 | Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

https://mp.weixin.qq.com/s/JwRXBNmXBaQM2GK6BDRqMw 选自GitHub 作者:Artur Suilin 机器之心编译 参与:蒋思源.路雪.黄小天 近日,Artur Suilin 等人发布了 Kaggle 网站流量时序预测竞赛第一名的详细解决方案.他们不仅公开了所有的实现代码,同时还详细解释了实现的模型与经验.机器之心简要介绍了他们所实现的模型与经验,更详细的代码请查看 GitHub 项目. GitHub 项目地址:https://github.com

Kaggle项目泰坦尼克号预测生存情况(上)-------数据预处理

假期闲着无聊,做了一下Kaggle练手的项目--预测泰坦尼克号乘客的存活情况.对于一些函数和算法,刚开始也是懵懵懂懂的,但通过自己查资料,还是明白了许多,我会把参考资料的网址放在需要查看的地方. ------------------------------------ 我们的整个流程如下: ①数据预处理:数据清洗.可视化.标签化 ②分割训练数据 ③随机森林分类器及其参数调节 数据预处理:数据清洗.可视化.标签化 首先,先导入需要的模块并读取数据 #导入包,读取数据 import numpy as

数据竞赛实战(3)——公共自行车使用量预测

前言 1,背景介绍 公共自行车低碳,环保,健康,并且解决了交通中“最后一公里”的痛点,在全国各个城市越来越受欢迎.本次练习的数据取自于两个城市某街道上的几处公共自行车停车桩.我们希望根据时间,天气等信息,预测出该街区在一小时内的被借取的公共自行车的数量. 2,任务类型 回归 3,数据文件说明 train.csv 训练集  文件大小为273KB test.csv          预测集  文件大小为179KB sample_submit.csv   提交示例      文件大小为97KB 4,数

Python数据分析--Kaggle共享单车项目实战

前言 上面一节我们介绍了一元线性回归和多元线性回归的原理, 又通过一个案例对多元线性回归模型进一步了解, 其中谈到自变量之间存在高度相关, 容易产生多重共线性问题, 对于多重共线性问题的解决方法有: 删除自变量, 改变数据形式, 添加正则化项, 逐步回归, 主成分分析等. 今天我们来看看其中的添加正则化项. 目录 1. 岭回归 2. Lasso回归 3. 岭回归和Lasso回归对比 4. 实际案例应用 正文 添加正则化项, 是指在损失函数上添加正则化项, 而正则化项可分为两种: 一种是L1正则化

Python大数据处理案例

分享 知识要点:lubridate包拆解时间 | POSIXlt利用决策树分类,利用随机森林预测利用对数进行fit,和exp函数还原 训练集来自Kaggle华盛顿自行车共享计划中的自行车租赁数据,分析共享自行车与天气.时间等关系.数据集共11个变量,10000多行数据.https://www.kaggle.com/c/bike-sharing-demand 首先看一下官方给出的数据,一共两个表格,都是2011-2012年的数据,区别是Test文件是每个月的日期都是全的,但是没有注册用户和随意用户

AI Boot Camp 分享之 ML.NET 机器学习指南

今天在中国七城联动,全球134场的AI BootCamp胜利落幕,广州由卢建晖老师组织,我参与分享了一个主题<ML.NET 机器学习指南和Azure Kinect .NET SDK概要>,活动虽然只有短短的2天时间的宣传,报名70人,到场40多人. 下面我和你分享一下我对ML.NET 机器学习的一些内容. 作为一个.NET开发者的你,可能很难立即进入机器学习.主要原因之一就是我们无法启动Visual Studio 使用我们所精通的.NET技术尝试这个新事物,这个领域被认为更适合该工作的编程语言

涅盘而生后的区块链正在如何影响金融,甚至全社会

互联网金融经历了野蛮生长之后也迎来了跑路.倒闭现象潮,同时人工智能.大数据.区块链等新科技正在引领互联网金融新的发展方向.尤其是区块链,这个从比特币中涅盘而生的创新技术,正在被人们认为可以重塑整个金融.与此同时,区块链也受到了风投与创业者的共同追逐,2015年,区块链成为了美国创投中获得融资最高的板块,突破10亿美元,投资比特币及区块链领域初创项目的风险投资公司已近200家. 在国内,"区块链"2016年底首度写入<"十三五"国家信息化规划>:2017年