这个线性回归的作业需要上传到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
然后试了试:
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就心满意足了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:机器学习 1 linear regression 作业(二) - Python技术站