天池-盐城上牌

   上次血糖的比赛没有能够进入复赛,有点小遗憾吧,但是毕竟是第一次打比赛,完全萌新,也没什么了,最后146名,继续加油吧,所以报了这个比赛。今天得知将收到天池的订制U盘。很高兴,哈哈,那就开始新的赛程吧。毕竟经验需要一点点的积累,这个又是一个新问题,和时间有关的。反正以我现在经验,遇到的都是新问题。比赛的数据和说明网址

  数据EDA,这是第一步:

# coding:UTF-8
import pandas as pd
import matplotlib.pyplot as plt

dir = 'data/'
train = pd.read_table(dir + 'train_20171215.txt', engine='python')
test_A = pd.read_table(dir + 'test_A_20171225.txt', engine='python')
sample_A = pd.read_table(dir + 'sample_A_20171225.txt', engine='python')

print train.head(5)
print train.describe()

查看数据的总体描述

# print train.head(5)
# print train.describe()
# 查看数据的信息
print train.info()
print test_A.info()
查看y值的箱型图, 箱型图有个功能就是可以检测这组数据是否存在异常值。.箱型图有个功能就是可以检测这组数据是否存在异常值


print train['day_of_week'].unique()
plt.boxplot(train['cnt'])
plt.show()


可以看出异常值存在大于1000的地方,而且数据分布符合右偏分布。画出y标签的其他分布形式。

# 查看y的分布情况
sns.distplot(train['cnt'], fit=norm)
(mu, sigma) = norm.fit(train['cnt'])
print('\n mu={:.2f} and sigma={:.2f}\n'.format(mu, sigma))
plt.legend(['Normal dist. ($\mu=${:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],
           loc='best')
plt.ylabel('Frequency')
plt.title('cnt分布')
fig = plt.figure()
res = stats.probplot(train['cnt'], plot=plt)
plt.show()

tmp, lambda_ = stats.boxcox(train['cnt'])
print len(tmp)
sns.distplot(tmp, fit=norm)
(mu, sigma) = norm.fit(tmp)
print( '\n mu = {:.2f} and sigma = {:.2f}\n'.format(mu, sigma))
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.7f} )'.format(mu, sigma)],
           loc='best')
plt.ylabel('Frequence')
plt.title('cnt分布')
fig = plt.figure()
res = stats.probplot(tmp, plot=plt)
plt.show()


将y修正为正态分布。能够更好的用于机器学习。

找出特征属性和目标值之间的属性关系,查看日期和cnt之间的关系

plt.plot(train['date'], train['cnt'])
plt.show()

可以发现数据的分布大部分都是在500附近的。

查看星期和标签y之间的特征关系。

# 查看星期特征和y标签之间的关系
sunday = train[train['day_of_week'] == 7]
plt.plot(range(len(sunday)), sunday['cnt'])
plt.show()


其他的星期和这个相同的代码,经过图片可以看出来,周末的分布和其他的工作日分布不一样。所以,我们需要将星期分割成两个集合进行分析。

初探代码:

# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from scipy.special import boxcox, inv_boxcox

dir = 'data/'
train = pd.read_table(dir + 'train_20171215.txt', engine='python')

actions1 = train.groupby(['date', 'day_of_week'], as_index=False)['cnt'].agg({'count1': np.sum})
# print actions1

df_train_target = actions1['count1'].values
print df_train_target
df_train_target = boxcox(df_train_target, 0.35)
y = inv_boxcox(df_train_target, 0.35)
print type(df_train_target)
print y

df_train_data = actions1.drop(['count1'], axis=1).values
print type(df_train_data)

train_x, test_x, train_y, test_y = train_test_split(df_train_data, df_train_target, test_size=0.2, random_state=502)

gdbt = GradientBoostingRegressor()
gdbt.fit(train_x, train_y)
res = gdbt.predict(test_x)

print '本地cv:'
print mean_squared_error(inv_boxcox(res, 0.35), inv_boxcox(test_y, 0.35))



'''
****************************test提交训练**************************************
'''
test_A = pd.read_table(dir + 'test_B_20171225.txt', engine='python')
gdbt.fit(df_train_data, df_train_target)
result = gdbt.predict(test_A)
result = inv_boxcox(result, 0.35)
pd_result = pd.DataFrame({'date': test_A["date"], 'cnt': result.astype(int)})
pd_result.to_csv('result_gdbt_B.txt', index=False, header=False, sep='\t', columns={'date', 'cnt'})
print '完成训练'













评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值