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