这个线性回归的作业需要上传到https://inclass.kaggle.com/c/ml2016-pm2-5-prediction 上面,这是一个kaggle比赛的网站。第一次接触听说这个东西,恰好在京东上有一本刚出来的关于这个的书《Python机器学习及实践:从零开始通往Kaggle竞赛之路》。把我自己写的代码运行保存的结果提交上去后发现,损失函数值很大,baseline是6,而我的却是8,于是很不心甘,尝试了其他方法无果后,准备利用scikit learn 工具刷刷数据。

具体步骤:

1 安装scikit learn  ,在CMD下输入

pip install -U scikit-learn

2 安装完成后就可以使用模型进行预测了,上完整代码

 1 # -*- coding: utf-8 -*-
 2 __author__ = 'Administrator'
 3 
 4 
 5 
 6 # -*- coding:UTF-8 -*-
 7 __author__ = 'tao'
 8 
 9 import csv
10 import cv2
11 import sys
12 import numpy as np
13 import matplotlib.pyplot as plt
14 from sklearn import datasets, linear_model
15 import math
16 
17 
18 filename = 'F:/台湾机器学习/data/train.csv'
19 ufilename = unicode(filename , "utf8") #这一块主要是因为汉字路径 也就是python调用open打开文件时,其路径必须要转换为utf-8格式
20 list=[]
21 result=[]
22 row=0
23 colum=0;
24 with open(ufilename, 'r') as f:
25     data = f.readlines()  #dat中所有字符串读入data
26     for line in data:
27         odom = line.split(',')        #将单个数据分隔开存好
28         colum=len(odom)
29         if 'PM2.5'in odom:
30             lists= map(int, odom[3:12])#第三个开始开始数据  一直取9个数
31             results= map(int, odom[12:13])#取第10个数
32             list.append(lists)
33             result.append(results)
34             # print odom
35         row=row+1
36 
37 #print("原始数据是:{0}行 :{1}列 的数据".format(row, colum))
38 print("有{0}个训练数据".format(len(list)))
39 
40 
41 ###
42 
43 regr = linear_model.LinearRegression()
44 regr.fit(list, result) #这里就是在训练模型了
45 print(' intercept: \n', regr. intercept_) #这就是w0,常数项
46 print('Coefficients: \n', regr.coef_) #这就是w1,常数项
47 
48 b_0=regr. intercept_
49 th =regr.coef_;
50 
51 print("-训练得到的权值如下--")
52 print" %10.5f %10.5f  %10.5f %10.5f   %10.5f  %10.5f  %10.5f %10.5f   %10.5f  %10.5f \n" %(b_0,th[0][0],th[0][1],th[0][2],th[0][3],th[0][4],th[0][5],th[0][6],th[0][7],th[0][8])
53 
54 #测试训练集
55 for k in range(len(list)):
56     xset = np.array(list[k])
57     nptresult= np.array(result[k])
58     # print("预测数据{0}".format( b_0 + np.dot(th,xset)))
59     # print("真实数据{0}".format(nptresult))
60     error= b_0 + np.dot(th,xset)-nptresult
61     print("训练集的实际误差{0}".format(error))
62 
63 
64 #读取测试集数据
65 testfilename = 'F:/台湾机器学习/data/test_X.csv'
66 utestfilename = unicode(testfilename , "utf8") #这一块主要是因为汉字路径 也就是python调用open打开文件时,其路径必须要转换为utf-8格式
67 testlist=[]
68 testrow=0
69 testcolum=0;
70 with open(utestfilename, 'r') as f:
71     data = f.readlines()  #dat中所有字符串读入data
72     for line in data:
73         odom = line.split(',')        #将单个数据分隔开存好
74         colum=len(odom)
75         if 'PM2.5'in odom:
76             testlists= map(int, odom[2:11])#第三个开始开始数据  一直取9个数
77             testlist.append(testlists)
78             # print odom
79         testrow=row+1
80 
81 print("测试数据是:{0}行 :{1}列 的数据".format(testrow, testcolum))
82 print("有{0}个测试数据".format(len(testlist)))
83 print(testlist)
84 
85 #输出最后的测试结果
86 csvfile = file('d:\\csv_result.csv', 'wb')
87 writer = csv.writer(csvfile)
88 writer.writerow(['id', 'value'])
89 for k in range(len(testlist)):
90     id_list=[]
91     xset = np.array(testlist[k])
92     result= b_0 +np.dot(th,xset)
93     int_result = int(result)
94     if(int_result<0):
95         int_result=0
96     id_list = [('id_{0}'.format(k), '{0}'.format(int_result))]
97     print(id_list)
98     writer.writerows(id_list)
99 csvfile.close()

得到的程序

-训练得到的权值如下--
bo 1.86833  wo -0.07357  w1 0.08100  w2 0.16498  w3-0.25133 w4 -0.05844 w5 0.67979 w5 -0.66656 w6 -0.12575 w7 1.22998

机器学习 1 linear regression 作业(二)

 

然后试了试:

from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.ensemble import GradientBoostingRegressor as GBR
下面三种回归方法,都没有达到好的排名。。。囧,
#regr = linear_model.LinearRegression()
#regr = linear_model.Ridge()
# regr = linear_model.Lasso()
regr =  GBR()

regr.fit(list, result) #这里就是在训练模型了

print(' intercept: \n', regr. intercept_) #这就是w0,常数项
print('Coefficients: \n', regr.coef_) #这就是w1,常数项
###

 error=  regr.predict(xset)-nptresult

参考博客:http://blog.csdn.net/sa14023053/article/details/51817650

算了,超过baseline就心满意足了。