這個線性迴歸的做業須要上傳到https://inclass.kaggle.com/c/ml2016-pm2-5-prediction 上面,這是一個kaggle比賽的網站。第一次接觸據說這個東西,剛好在京東上有一本剛出來的關於這個的書《Python機器學習及實踐:從零開始通往Kaggle競賽之路》。把我本身寫的代碼運行保存的結果提交上去後發現,損失函數值很大,baseline是6,而個人倒是8,因而很不心甘,嘗試了其餘方法無果後,準備利用scikit learn 工具刷刷數據。python
具體步驟:app
1 安裝scikit learn ,在CMD下輸入dom
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就心滿意足了。網站