kaggle(03)-自行车租赁预测问题(基础版)

文章目录

  • 问题描述:
  • 问题解决
    • 分析问题:
    • 解决问题
      • 第一步:读取原始数据
      • 第二步:观察原始数据
      • 第三步:原始数据的可视化
      • 第四步:数据的预处理
        • 时间属性的分解
      • 第五步:数据的特征提取
        • 特征生成
        • 特征选择
      • 第六步:训练baseline
      • 第七步:模型的状态估计(通过学习曲线)
      • 第八步:模型优化

问题描述:

  • 在对一个应用使用机器学习算法之前我们应该要分析清楚问题是什么
  • 本次项目所要解决的问题是:通过共享单车上的传感器采集的数据和系统上记录的用户的行为数据,用来预测一年中不同时间段某个地区单车的使用情况,从而确定单车在该区域的投放数目,保证单车租赁公司的利益最大化。
  • 本项目中收集到的数据中包括:时间(年-月-日-时),季节(春夏秋冬),节日(是/否),工作日(是/否),天气(四个等级),温度,体感温度,湿度,风速,非注册人员租赁,注册人员租赁,租赁人数;

问题解决

分析问题:

  • 从项目的描述来看,这是一个回归问题,希望我们通过采集的数据去预测未来某段时间内单车的需求量。
  • 从采集的数据的属性上可以猜测一些:
    • 工作日大家应该没有时间去骑单车出去玩,节假日应该偏多
    • 温度太低或者风速太大都不适合骑单车出去
    • 注册的人员使用单车的频率应该比非注册的人员使用单车频率高

解决问题

第一步:读取原始数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#从本地磁盘读取数据
df_train = pd.read_csv('kaggle_bike_competition_train.csv',header = 0)  
df_train.head(10)  #查看前10项内容

在这里插入图片描述

通过查看原始数据发现,datatime这一项数据包括了年月日时分秒,后续可以将其拆分开来。虽然将数据打印出来,但是这样的方式不太直观,我们可以通过调用df.info()和df.describe()函数查看数据的统计信息。

第二步:观察原始数据

df_train.dtypes  #查看数据中每行的属性值

在这里插入图片描述

可以看出数据中大部分都是数值型的数据,只有datatime是类别型的数据。

df_train.info()

在这里插入图片描述

数据的完整性非常好。所有属性的数据都没有缺失值,那么接下我们看一下数值型数据的取值范围吧!

df_train.describe()

在这里插入图片描述

数据中的数值型数据的取值范围相差不大,每个属性内部的取值范围也不大,所以觉得对数据做缩放意义不大。接下来我们通过可视化看看每个属性与预测值之间的关系吧!

第三步:原始数据的可视化

# 风速
df_train_origin.groupby('windspeed').mean().plot(y='count', marker='o')  #画出风速和租车次数的关系
plt.show()

在这里插入图片描述

图中的结果似乎与我们一开始的猜测有些出入,尤其是图中风速大于50后,单车租赁次数反而剧增,这是一个比较特别的地方,后面可以着重考虑

# 湿度
df_train_origin.groupby('humidity').mean().plot(y='count', marker='o')  #画出湿度值与租车次数的关系
plt.show()

在这里插入图片描述

从图中可以看出过干和过湿都会导致单车租赁的减少。

# 温度
df_train_origin.groupby('temp').mean().plot(y='count', marker='o')  #画出温度与租车次数的关系
plt.show()

在这里插入图片描述

从图中的结构似乎可以看出随着温度的升高,单车租赁次数也越多,这是符合我们之前的猜测的。

#温度湿度变化
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')

在这里插入图片描述

从图中结果似乎只能看出温度,体感温度和租车次数呈现一定的正相关,风速与租车次数是负相关

# scatter一下各个维度
sns.pairplot(df_train_origin[["temp", "month", "humidity", "count"]], hue="count")

在这里插入图片描述

各个属性之间的相关性不是很强。

# 来看看相关度咯
corr = df_train_origin[['temp','weather','windspeed','day', 'month', 'hour','count']].corr()
corr

在这里插入图片描述

似乎这样比上面的图像的结果理解起来更加方便,从表格的结果可知:温度和小时与汽车租赁的相关性最大。

第四步:数据的预处理

由于原始数据不存在缺失值,类别属性特征也较少,数值型数据比较规范,所以不需要太多的数据预处理,只需要对时间属性进行处理进行。

时间属性的分解

# 把月、日、和 小时单独拎出来,放到3列中
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
# 再看
df_train.head(10)

在这里插入图片描述

# 那个,保险起见,咱们还是先存一下吧
df_train_origin = df_train
# 抛掉不要的字段
df_train = df_train.drop(['datetime','casual','registered'], axis = 1)  #删除'datetime','casual','registered'等列的数据
# 看一眼
df_train.head(5)

在这里插入图片描述

# 得到X和Y
df_train_target = df_train['count'].values
df_train_data = df_train.drop(['count'],axis = 1).values
print 'df_train_data shape is ', df_train_data.shape
print 'df_train_target shape is ', df_train_target.shape

df_train_data shape is (10886L, 11L)
df_train_target shape is (10886L,)

第五步:数据的特征提取

特征生成

由于原始户数比较规范,暂时先不做特征生成

特征选择

由于数据比较规范,暂时不做特征选择

第六步:训练baseline

from sklearn import linear_model
from sklearn import cross_validation
from sklearn import svm
from sklearn.ensemble import RandomForestRegressor
from sklearn.learning_curve import learning_curve
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import explained_variance_score# 总得切分一下数据咯(训练集和测试集)
cv = cross_validation.ShuffleSplit(len(df_train_data), n_iter=3, test_size=0.2,random_state=0)  #使用3折交叉验证的方法# 各种模型来一圈print "岭回归"    
for train, test in cv:    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: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:    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])))

在这里插入图片描述

上面简单的比较了几种常用的回归算法在数据集上的表现,从实验的结果可以看出,随机森林的结果是最佳的。

第七步:模型的状态估计(通过学习曲线)

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 plttitle = "Learning Curves (Random Forest, n_estimators = 100)"
cv = cross_validation.ShuffleSplit(df_train_data.shape[0], n_iter=10,test_size=0.2, random_state=0)
estimator = RandomForestRegressor(n_estimators = 100)
plot_learning_curve(estimator, title, X, y, (0.0, 1.01), cv=cv, n_jobs=4)plt.show()

在这里插入图片描述

从图中的结果可以看出,模型处于过拟合状态

第八步:模型优化

从上面的记过可以看出,模型处于过拟合状态,可以从模型的参数,特征两方面来解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树序列化/反序列化

二叉树被记录成文件的过程,为二叉树的序列化 通过文件重新建立原来的二叉树的过程,为二叉树的反序列化 设计方案并实现。 (已知结点类型为32位整型) 思路:先序遍历实现。 因为要写入文件,我们要把二叉树…

机器学习总结(17)-XGBoost

文章目录lecture17:XGBoost(eXtreme Gradient Boosting)目录1. XGBoost的基本信息2. XGBoost与GBDT的异同点3. XGBoost的原理3.1定义树的复杂度3.2 分裂节点3.3 自定义损失函数4. XGBoost的使用lecture17:XGBoost(eXtreme Gradient Boosting) 目录 1. …

C++基础学习(01)--(介绍,环境配置,基本语法,注释)

文章目录目录一. c介绍二. c开发环境到的配置三. c基本语法四. c注释目录 一. c介绍 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低…

《Head First设计模式》读书笔记_第一章

策略模式 例:设计一个模拟鸭子游戏,游戏中有各种鸭子,一边戏水一边嘎嘎叫。 所以学习设计模式前,我们最先想到的就是设置一个超类,并让其他子类去继承这个类,UML图如下: * * 但是&#xff0…

C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)

文章目录目录一. 数据类型C 中的数据类型typedefenumeration枚举类型c中变量类型二.变量作用域三.常量四.修饰符类型目录 一. 数据类型 C 中的数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&a…

c++基础学习(03)--(存储类,运算符,循环,判断)

文章目录目录一.存储类二.运算符三.循环whilefor四.判断目录 一.存储类 可见static存储类修饰之后&#xff0c;i的值没有从头开始&#xff0c;而是从上一次的结果中保留下来 #include <iostream>using namespace std; class Data { public:Data(){}~Data(){}void show()…

皇后问题

八皇后问题是一个以国际象棋为背景的问题&#xff1a;如何能够在 88 的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了达到此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的…

c++基础学习(04)--(函数、数字、数组、字符串)

文章目录目录1.函数2.数字3.字符串4.数组目录 1.函数 #include <iostream> #include <limits>using namespace std;void swap(int *x , int *y);int main(){int a 100 , b200;cout<<"交换前:"<<"a is :"<<a<<"…

【精品计划0】蓝桥杯 摔手机

原题描述&#xff1a; x星球的居民脾气不太好&#xff0c;但好在他们生气的时候唯一的异常举动是&#xff1a;摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试&#xff0c;并且评定出一个耐摔指数来&#xff0c;之后才允许上市流通。 …

数据结构课上笔记15

图的存储 多重链表&#xff1a;完全模拟图的样子&#xff0c;每个节点内的指针都指向该指向的节点。 节点结构内指针数为度 缺点&#xff1a;浪费空间、不容易操作 数组表示法&#xff08;邻接矩阵表示法&#xff09; 可用两个数组存储。其中一个 一维数组存储数据元素&#…

c++基础学习(05)--(指针,引用)

文章目录目录1.指针2.引用目录 1.指针 #include <iostream>using namespace std;int main () {int var1;char var2[10];cout << "var1 变量的地址&#xff1a; ";cout << &var1 << endl;cout << "var2 变量的地址&#xff…

由旅行商问题认识何为状态压缩

动态规划 动态规划(dynamic programming)是运筹学的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时&#xff0c;提出了著名的最优化原理(pri…

c++基础学习(06)--(时间,输入输出,数据结构)

文章目录目录1.时间2.输入输出数据结构目录 1.时间 当前日期和时间 下面的实例获取当前系统的日期和时间&#xff0c;包括本地时间和协调世界时&#xff08;UTC&#xff09;。 #include <iostream> #include <ctime>using namespace std;int main( ) {// 基于当前…

Abstract Self-Balancing Binary Search Tree

二叉搜索树 二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索树&#xff0c;二叉排序树&#xff09;它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结…

AVL Tree

前言 希望读者 了解二叉搜索树 了解左旋右旋基本操作 https://blog.csdn.net/hebtu666/article/details/84992363 直观感受直接到文章底部&#xff0c;有正确的调整策略动画&#xff0c;自行操作。 二叉搜索树 二叉查找树&#xff08;Binary Search Tree&#xff09;&a…

c++基础学习(07)--(类)

文章目录目录类与对象1.类成员函数2.类访问修饰符3.构造函数与析构函数4.拷贝构造函数5. 友元函数6.内联函数7.this指针8.指向类的指针9.类的静态成员目录 类与对象 #include <iostream>using namespace std;class Box {public:double length; // 长度double breadth;…

c++基础学习(08)--(继承、重载、多态、虚函数)

文章目录目录1.继承2.重载3.多态 && 虚函数目录 1.继承 #include <iostream>using namespace std;// 基类 class Shape {public:void setWidth(int w){width w;}void setHeight(int h){height h;}protected:int width;int height; };// 派生类 class Rectang…

图的应用

1. 图的应用总览 在数据结构中图的应用很广泛&#xff0c;本文主要从以下四个方面介绍&#xff1a; ①最小生成树&#xff1a;给定一个无向网络&#xff0c;在该网的所有生成树中&#xff0c;使得各边权数之和最小的那棵生成树称为该网的最小生成树&#xff0c;也叫最小代价…

c++基础学习(09)--(数据抽象、数据封装、接口)

文章目录目录1.数据抽象2.数据封装3.抽象接口类目录 1.数据抽象 数据抽象&#xff1a;就是把它当做黑箱子使用&#xff0c;内部实现与外部接口分开 C类实现数据抽象&#xff0c;如sort()函数&#xff0c;ostream的cout对象 #include <iostream> using namespace std…

c++基础学习(10)--(文件、流、异常处理、动态内存、命名空间)

文章目录目录1.文件和流2.异常处理3.动态内存4.命名空间目录 1.文件和流 注意 文件打开方式中的in和out都是相对于内存&#xff08;计算机&#xff09;而言的&#xff0c;计算机读取文件&#xff0c;是将数据从磁盘中的文件读入到内存中&#xff0c;所以用的是in #include &…