李宏毅 ML HW1 预测PM2.5

1.处理train.csv和test.csv

在train.csv增加column名称并设为英文,改变编码将文件保存为utf-8的格式,同样将test.csv的列标签改为英文。

2.数据处理

2.1取出所有pm2.5的数据

import pandas as pd
import numpy as np
from pandas import DataFrame
import math
train = pd.read_csv("train.csv")
pm=train[train["Observation"]=="PM2.5"]#提取所有pm=2.5的数据2.

2.2删除Date,Location,Observation列标签,便于后面提取数据

pm.drop(['Date','Location','Observation'],axis=1,inplace=True)

drop删除:删除表中的某一行或者某一列,不改变原有的df中的数据,而是返回另一个dataframe来存放删除后的数据。

       1.删除行,列默认删除行,axis=1删除列

         print frame.drop(['a'])

         print frame.drop(['Ohio'],axis=1)

      2.inplace参数(以下有3种等价的表达方式)

         df=drf.drop('column_name',axis=1)

        df.drop('column_name',axis=1,inplace=True)

        df.drop(df.columns[[0,1,3]],axis=1,inplace=True)

凡是对原数组作出修改并返回一个新数组的,往往都有一个 inplace可选参数。如果手动设定为True(默认为False),那么原数组直接就被替换,也就是说,采用inplace=True之后,原数组名对应的内存值直接改变;而采用inplace=False之后,原数组名对应的内存值并不改变,需要将新的结果赋给一个新的数组或者覆盖原数组的内存位置。

      3.数据类型转换

df['Name'] = df['Name'].astype(np.datetime64)

DataFrame.astype() 方法可对整个DataFrame或某一列进行数据格式转换,支持Python和NumPy的数据类型。

2.3 training data

从训练数据中提取出连续十个小时的观测数据,最后一个小时的PM2.5作为该条数据的类标签,而前九个小时的PM2.5值作为特征。一天24个小时,一天内总共有24-10+1 =15条记录。

tempxlist=[]
tempylist=[]
for i in range(15):
    tempx=pm.iloc[:,i:i+9]        #使用前9小时数据作为feature
    tempx.columns=np.array(range(9))
    tempy=pm.iloc[:,i+9]         #使用第10个小数数据作为lable
    tempy.columns=['1']
    tempxlist.append(tempx)
    tempylist.append(tempy)
loc——通过行标签索引行数据 
iloc——通过行号索引行数据 (左闭右开)
ix——通过行标签或者行号索引行数据(基于loc和iloc 的混合)
index=['a','b']#行号
columns=['c','d','e']#列号

loc:  (索引第一行)df.loc['a']        (索引第一列)df.loc[:,['c']]             (索引多行) df.loc['a':'b']   (索引多列)df.loc[:,'c':'d']

illoc:(索引第一行)df.illoc[0]        (索引第一列)df.iloc[:,[0]]             (索引多行) df.iloc[0:1]      (索引多列)df.iloc[:,0:2]

ix:   (索引第一行)df.ix['a'] 或df.ix[0] (索引第一列)df.ix[:,['c']]或df.ix[:,[0]]

       (索引多行)df.ix['a':'b']              (索引多列)df.ix[:,'c':'d']或df.ix[:,0:2]

 
xdata=pd.concat(tempxlist)     #feature数据
x=np.array(xdata,float)
print(x)
x.shape (3600,9)
ydata=pd.concat(tempylist)      #lable数据
ydata.head()
y=(np.array(ydata,float))
print(y)
y.shape (3600,)

3.训练模型(使用gradient descent)

将前九个小时的数据作为feature,最后一个作为lable,采用adagrad进行训练。

x = np.concatenate((np.ones((x.shape[0],1)),x), axis=1)#在feature基础上加入bias
#初始化一个learning rate
lr=10
iteration=10000   #迭代10000次
s_grad=np.zeros(len(x[0]))
for i in range(iteration):
    tem=np.dot(x,w)     #&y^*&(预测值)
    loss=y-tem
    grad=np.dot(x.transpose(),loss)*(-2)
    s_grad+=grad**2
    ada=np.sqrt(s_grad)
    w=w-lr*grad/ada
print(w)

4.预测

testdata=pd.read_csv("test.csv")#导入用作为测试的依据
pm2_5_test=testdata[testdata['Observation']=='PM2.5'].ix[:,2:]#取出测试集
x_test=np.array(pm2_5_test,float)
print(x_test)
#在测试集上加入bias
x_test_b=np.concatenate((np.ones((x_test.shape[0],1)),x_test),axis=1)
#预测
y_star=np.dot(x_test_b,w)
y_pre=pd.read_csv('https://ntumlta.github.io/2017fall-ml-hw1/sampleSubmission.csv')
y_pre.value=y_star

5.计算误差

real=pd.read_csv('https://ntumlta.github.io/2017fall-ml-hw1/ans.csv')
erro=abs(y_pre.value-real.value).sum()/len(real.value)
print(erro)

误差为:4.97442948413

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值