數(shù)據(jù)讀入及分析
打開(kāi)數(shù)據(jù)
data = pd.read_csv('train.csv')
data1=pd.read_csv('test.csv')
train_data = data.values[0:,1:]#讀入全部訓(xùn)練數(shù)據(jù)
train_label = data.values[0:,0]
test_data=data1.values[0:,0:]#測(cè)試全部測(cè)試個(gè)數(shù)據(jù)
return train_data,train_label,test_data ``
使用pandas庫(kù)讀入數(shù)據(jù)超級(jí)強(qiáng)大,直接可以把表格讀成矩陣淋叶。pandas是基于numpy庫(kù),所以使用和numpy比較像。由于我們讀入的數(shù)據(jù)太多,我們需要進(jìn)行一些簡(jiǎn)單的處理
## 歸一化數(shù)據(jù)
``` def nomalizing(array):#歸一化數(shù)據(jù)
m,n=shape(array)
for i in range(m):
for j in range(n):
if array[i,j]!=0:
array[i,j]=1
return array ```
##使用pvc進(jìn)行降維處理
由于訓(xùn)練數(shù)據(jù)的特征值太多,而且一部分并不影響結(jié)果。我們將使用sklearn中自帶的pvc主成元分析工具伙判,進(jìn)行降維處理。其中原理黑忱,大概是將數(shù)據(jù)向量投影到各個(gè)維度宴抚,某些維度投影較小,即沒(méi)什么用甫煞。具體見(jiàn)斯坦福機(jī)器學(xué)習(xí)課程菇曲。
首先我們導(dǎo)入一個(gè)庫(kù)``` from sklearn.decomposition import PCA ```
1.**類(lèi)的原型說(shuō)明 **
``` sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False) ```
> n_components:int 或者 string,缺省時(shí)默認(rèn)為None抚吠,所有成分被保留常潮。PCA算法中所要保留的主成分個(gè)數(shù)n,也即保留下來(lái)的特征個(gè)數(shù)n埃跷;賦值為string蕊玷,比如n_components=’mle’邮利,將自動(dòng)選取特征個(gè)數(shù)n弥雹,使得滿(mǎn)足所要求的方差百分比。
copy:True或者False延届,缺省時(shí)默認(rèn)為T(mén)rue剪勿。表示是否在運(yùn)行算法時(shí),將原始訓(xùn)練數(shù)據(jù)復(fù)制一份方庭。True 將保持原始數(shù)據(jù)不變厕吉,F(xiàn)alse 則直接在原始數(shù)據(jù)上進(jìn)行計(jì)算
whiten:缺省時(shí)默認(rèn)為False。白化械念,是否使得每個(gè)特征具有相同的方差头朱。
2.**pvc對(duì)象的使用**
```fit(X,y=None) ```
> fit()可以說(shuō)是scikit-learn中通用的方法,每個(gè)需要訓(xùn)練的算法都會(huì)有fit()方法龄减,它其實(shí)就是算法中的“訓(xùn)練”這一步驟项钮。因?yàn)镻CA是無(wú)監(jiān)督學(xué)習(xí)算法,此處y自然等于None希停。
fit(X)烁巫,表示用數(shù)據(jù)X來(lái)訓(xùn)練PCA模型。
``` fit_transform(X) ```
用X來(lái)訓(xùn)練PCA模型宠能,同時(shí)返回降維后的數(shù)據(jù)亚隙。
``` newX=pca.fit_transform(X) ```,newX就是降維后的數(shù)據(jù)违崇。
#進(jìn)行機(jī)器學(xué)習(xí)
1.**knn算法**
```def knnClassify(trainData,trainLabel,testData):
knnClf=KNeighborsClassifier()#k=5 KNN中鄰值為5阿弃,
knnClf.fit(trainData,ravel(trainLabel))
testLabel=knnClf.predict(testData)
savetxt('sklearn_knn_Result.csv', testLabel, delimiter=',') ```
可以通過(guò)KNeighborsClassifier(n_neighbors=k)進(jìn)行參數(shù)選擇
這個(gè)算法因?yàn)槊款A(yù)測(cè)一個(gè)數(shù)據(jù)诊霹,就要反復(fù)大量運(yùn)算,所以花費(fèi)時(shí)間特別長(zhǎng)恤浪。
> 花費(fèi)時(shí)間 20分鐘
精度0.96400
以上默認(rèn)參數(shù)情況如下畅哑,下面進(jìn)行調(diào)參。
``` knn_clf=KNeighborsClassifier(n_neighbors=5, algorithm='kd_tree', weights='distance', p=3) ```
> 第一個(gè)參數(shù)為k值水由,第二個(gè)參數(shù)為搜索算法荠呐,默認(rèn)暴力法,還有兩種砂客。 {‘a(chǎn)uto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}泥张,第三個(gè)參數(shù)為權(quán)重,第四個(gè)為norm選擇鞠值,p=2為歐式媚创,p=1為曼哈頓,p=3。
經(jīng)過(guò)我的測(cè)試彤恶,k=5,alg=kd,weights='distance',p=3最準(zhǔn)確
``` def knnClassify(trainData,trainLabel):
t=time.time()#測(cè)試時(shí)間
knnClf=KNeighborsClassifier(n_neighbors=5,algorithm='kd_tree', weights='distance', p=3)#調(diào)參
score = cross_val_score(knnClf, trainData, trainLabel, cv=3)#用原始數(shù)據(jù)的劃分钞钙,進(jìn)行準(zhǔn)確度測(cè)試
print(score.mean())
print('time use%f'%(time.time()-t)) ```
> 花費(fèi)時(shí)間448.856398
精度0.939898157339
完整的算法見(jiàn)github [kaggle_knn](https://github.com/00crazy00/kaggle_KNN.git)
> 花費(fèi)時(shí)間1900s
精度0.96443
2.**決策樹(shù)算法**
``` def treeClassify(trainData,trainLabel,testData):
clf = tree.DecisionTreeClassifier()
b = clf.fit(trainData,trainLabel)
testLabel=clf.predict(testData)
savetxt('sklearn_TREE.csv', testLabel, delimiter=',') ```
> 決策樹(shù)(Decision Tree)是一種簡(jiǎn)單但是廣泛使用的分類(lèi)器。通過(guò)訓(xùn)練數(shù)據(jù)構(gòu)建決策樹(shù)声离,可以高效的對(duì)未知的數(shù)據(jù)進(jìn)行分類(lèi)芒炼。決策數(shù)有兩大優(yōu)點(diǎn):1)決策樹(shù)模型可以讀性好,具有描述性术徊,有助于人工分析本刽;2)效率高,決策樹(shù)只需要一次構(gòu)建赠涮,反復(fù)使用子寓,每一次預(yù)測(cè)的最大計(jì)算次數(shù)不超過(guò)決策樹(shù)的深度。決策樹(shù)基于信息論中的信息嫡劃分決策樹(shù)笋除。
> 時(shí)間20s
精度0.87029
3.**邏輯回歸**
``` def logClassify(trainData,trainLabel,testData):
classifier = LogisticRegression()
classifier.fit(trainData, trainLabel)
x = classifier.predict(testData)
savetxt('sklearn_log_Result.csv', x, delimiter=',') ```
具體算法參考《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》和斯坦福課程斜友。
> 時(shí)間80s
精度0.90629
4.**支持向量機(jī)**
支持向量機(jī)效果很好,花費(fèi)時(shí)間也不是太多垃它。原理是基于選取空間的支持向量鲜屏。深入的話(huà)需要大量數(shù)學(xué),以后再探究
``` def svmClassify(trainData,trainLabel,testData):
t = time.time()
pca = PCA(n_components=0.8, whiten=True)
train_x = pca.fit_transform(trainData)
test_x = pca.transform(testData)
svc = svm.SVC(kernel='rbf', C=10)
svc.fit(train_x, trainLabel)
h=time.time()
print('time used:%f' % (h - t))
test_y = svc.predict(test_x)
k=time.time()
print('time used:%f' % (k - h))
savetxt('sklearn_svm_Result.csv', test_y, delimiter=',') ```
> 花費(fèi)時(shí)間57s
精度0.98529
5.**隨機(jī)森林**
6.**深度學(xué)習(xí)**
(持續(xù)更)