1. 程式人生 > >第一次參加Kaggle

第一次參加Kaggle

過程:

下午看書看得太難受了,超無聊的,就想著乾脆先跳過這些公式和語法,直接先開一場Kaggle

註冊,頭一次選擇專案參賽,選了個看起來資料很規整,純數字的(因為我不會影象):

樹葉分類比賽:

https://www.kaggle.com/c/leaf-classification/

磨磨磨了一個下午加晚上終於寫完了:

<span style="font-family:Microsoft YaHei;font-size:14px;"># -*- coding: utf-8 -*-
"""
Created on Sun Sep 25 13:51:57 2016

@author: ATE
"""
#import------------------------------------
from pandas import DataFrame
from pandas import Series
import pandas as pd
from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor  
import numpy as np 

#read-------------------------------------
trainPath='train.csv'
prodictPath='test.csv'
samplePath='sample_submission.csv'
savePath='result.csv'

trainSet=pd.read_csv(trainPath) 
prodictSet=pd.read_csv(prodictPath) 
submissionSet=pd.read_csv(samplePath)

#data_transform---------------------------
targetSet=trainSet['species']
train=trainSet.drop('species',axis=1)

targetTypeDict=Series(targetSet.unique()).to_dict()
targetTypeMapDict=dict((v,k) for k,v in targetTypeDict.iteritems())

targetSet=targetSet.map(targetTypeMapDict)

#randomForest------------------------------------

rf = RandomForestRegressor()  
rf.fit(train,targetSet)
res=rf.predict(prodictSet)  
#data_reform--------------------------------

res=np.around(res, decimals=0)
resSeries=Series(res)
resSeries=resSeries.map(targetTypeDict)


submissionSetS=submissionSet.applymap(lambda x:0)

indexList=range(len(resSeries))

for index in indexList:
        typeName=resSeries[index]
        submissionSetS.loc[index,typeName]=1
    
submissionSetS['id']=submissionSet['id']
submissionSetS.to_csv(savePath,index=False)
</span>
對於初次參賽者來說,最難的是把結果資料重新構造回去的過程,花了一個晚上哈哈哈哈

結果:

竟然最後還不是最後一名:


倒數第四,嗯嗯,還是比三個人厲害呢!

而且分類錯誤率“只有”33%,對於一個不是生物學專業的來說還是很強?

哈哈哈哈哈哈哈,總之第一次熟悉了流程,感覺還是很興奮和好玩的

結果我去看一下別人的程式碼:

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier

np.random.seed(42)

train = pd.read_csv('../input/train.csv')
x_train = train.drop(['id', 'species'], axis=1).values
le = LabelEncoder().fit(train['species'])
y_train = le.transform(train['species'])
scaler = StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)

test = pd.read_csv('../input/test.csv')
test_ids = test.pop('id')
x_test = test.values
scaler = StandardScaler().fit(x_test)
x_test = scaler.transform(x_test)

#params = {'C':[1, 10, 50, 100, 500, 1000, 2000], 'tol': [0.001, 0.0001, 0.005], 'solver':  ["newton-cg"]}
#log_reg = LogisticRegression(multi_class="multinomial")
#clf = GridSearchCV(log_reg, params, scoring='log_loss', refit='True', n_jobs=1, cv=5)
#clf.fit(x_train, y_train)
#y_test = clf.predict_proba(x_test)

log_reg = LogisticRegression(C=2000, multi_class="multinomial", tol=0.0001, solver='newton-cg')
log_reg.fit(x_train, y_train)
y_test = log_reg.predict_proba(x_test)


#params = {'n_estimators':[1, 10, 50, 100, 500]}
#random_forest = RandomForestClassifier()
#clf = GridSearchCV(random_forest, params, scoring='log_loss', refit='True', n_jobs=1, cv=5)
#clf.fit(x_train, y_train)
#y_test = clf.predict_proba(x_test)

submission = pd.DataFrame(y_test, index=test_ids, columns=le.classes_)
submission.to_csv('submission2.csv')

what?二十行就寫完了?what?就一個邏輯迴歸就搞定了?錯誤率才0.02?要知道我可是用了高大上的隨機森林啊!what?我翻來倒去弄來弄去的資料規整,竟然sklearn裡有一個叫LabelEncoder的工具兩行就搞定了?

吊飛了!哈哈哈看來還要好多東西可以學啊!

感受:

真的能學到好多東西。

感覺最大的不同就是kaggle裡你是按照自己的想法去寫程式碼的,想到哪裡寫哪裡,如果一個語法寫不出來就用別的辦法繞過,所以基本上都能寫出來。終於沒有那種被python的奇葩語法各種煩的感覺了,可能是自己也熟一點了,也可能是感覺自己做的事情更有意義了。

而且最後看看自己是怎麼被大神各種虐的,學到一招兩招,也是超爽的感覺。

如果不自己試著做一遍,可能看到大神的程式碼,也是一點感覺都沒有的,有感觸的句子,可能也很少吧。

而且,一開始我還在想可能排前面的人用了各種優化,比如,根據名字的拼寫來確定兩個分類間的接近的關係(比如Acer_Opalus和Acer_Platanoids可能就有點相近的關係),或者用影象的方法把圖片做了特徵什麼的,結果並不是這樣......人家直接一個邏輯迴歸就把正確率壓倒0.02了,用神經網路的話更是很快就降到0了。。。。可能是這個例子太簡單了吧。。。。