python pandas 基本使用,sklearn的10種分類器實踐
由於最近程式碼任務不多,就想把pandas的日常使用和sklearn的建模使用更加規範和熟練,因此就以泰坦尼克的相關資料集為測試資料進行分析。
資料集在 https://codeload.github.com/fayduan/Kaggle_Titanic/zip/master
#!/usr/bin/python # -*- coding: utf-8 -*- __author__ = 'Wind' """Wish No Bug""" import pandas as pd import numpy as np import os import matplotlib.pyplot as plt from sklearn.cross_validation import cross_val_score os.chdir('C:/Users/CC/PycharmProjects/work/titanc') # 設定工作路徑 data = pd.read_csv('train.csv') # 讀取訓練資料 data.keys() # 檢視資料的基本情況 print data.info() # 顯示頭部的資料 print data.head() # 顯示尾部的資料 print data.tail() # 顯示資料的行號 print data.index # 顯示資料的列號 print data.columns # 進行大概的描述性統計 print data.describe() # 按照船艙等級進行排序,並且將na放在前排,倒序 temp_data = data.sort_values(by=['Pclass', 'Age'], na_position='first', ascending=False) print temp_data.head() # 按照行座標進行排序 temp_data = data.sort_index(axis=0, ascending=False) print temp_data.head() # 進行資料的轉置 temp_data = data.T print temp_data.head() # 進行列的選擇 print data['Age'].head() # 進行行的選擇 print data[1:5] # loc只能根據標籤進行索引 # 利用loc根據行的標籤決心選擇 print data.loc[1, ['Age', 'Sex']] # iloc可以根據位置行號和列號進行索引相當於陣列索引 # 利用iloc根據行號進行選擇 print data.iloc[1, 1:3] # 利用iloc 選擇某列 print data.iloc[:, 1] # 根據位置進行選擇 print data.iloc[[1, 3], [2, 3]] # 獲取特定的值 print data.iat[1, 1] print data.iloc[1, 1] # 進行boll索引 print data[data['Pclass'] == 1].iloc[1] # 根據isin函式進行boll選擇 print data[data['Pclass'].isin([1, 3])].head() # 對列的值進行替換 temp_data = data.copy() temp_data.loc[:, 'Age'] = np.array([1] * len(data)) print temp_data.loc[1] # 判斷缺失值,返回boll型 print temp_data.isnull() # 處理缺失值,如果該行出現缺失值,則剔除 print temp_data.dropna(axis=0, how='any').info() # 進行缺失值的填充,inplace = false 表示是否在原始資料上進行操作 # thresh 表示門閥值,缺失值大於thresh的資料就進行剔除 print temp_data.fillna(value=5) # 進行描述性統計 print data.mean(axis=0) # apply 按列進行處理 print data.apply(np.max) # 繪製直方圖 print data[['Age']].plot.hist() plt.show() # 繪製柱形圖 # 計算分組交叉表 temp_data = pd.crosstab(data['Pclass'], data['Survived']) temp_data.plot.bar() # print data[['Pclass','Survived']].groupby(by = 'Survived').count() # print data[['Survived', 'Pclass']].groupby(by = 'Pclass').sum().plot.bar(y = 'Survived', x ='Pclass',stacked=True) plt.show() # 繪製箱圖 data['Age'].plot.box() plt.show() # 進行資料合併 pieces = [data[:3], data[5:10], data[11:20]] temp_data = pd.concat(pieces) print temp_data # 在原有資料上面增加一行 temp_row = temp_data.iloc[1] print temp_data.append(temp_row, ignore_index=True) # 進行group操作 print data.groupby(['Pclass']).sum() print data.groupby(['Pclass', 'Survived']).sum() # 生成資料透視表 print pd.pivot_table(data=data, values='Age', index='Survived', columns='Pclass') # 輸出資料 # data.to_csv(file) # 運用sklearn的10個分類演算法進行建模操作 # 去除空白值 print data.info() data_1 = data.drop(['Age', 'Cabin'], axis=1) data_1 = data_1.dropna(axis=0, how='any') print data_1.info() # 對二維以上的分類變數就行啞變數處理 data_1.head() Pclass = pd.get_dummies(data_1['Pclass'], prefix='Pclass') print Pclass.head() # 將啞變數增加到原有資料框中 data_2 = pd.concat([data_1, Pclass], axis=1) print data_2.head() # metric_all 儲存了10個監督模型的f1結果 metric_all = pd.DataFrame() # 以data_2為基礎資料進行預測 X = data_2.drop(['PassengerId', 'Survived', 'Name', 'Ticket', 'Embarked'], axis=1) X['Sex'][X['Sex'] == 'male'] = 1 X['Sex'][X['Sex'] == 'female'] = 0 Y = data_2['Survived'] # 首先進行交叉驗證的分組 # 構造glm模型 from sklearn.linear_model import LogisticRegression lr = LogisticRegression(C=1000, random_state=0) metric = cross_val_score(lr, X, Y, cv=10, scoring='f1') metric.sort() metric_all['glm'] = metric[::-1] # 擬合決策樹模型 from sklearn import tree tree = tree.DecisionTreeClassifier(criterion='gini') metric = cross_val_score(tree, X, Y, cv=10, scoring='f1') metric.sort() metric_all['tree'] = metric[::-1] # 擬合svm模型 from sklearn import svm svc = svm.SVC(C=1.0, kernel='rbf', gamma='auto') metric = cross_val_score(svc, X, Y, cv=10, scoring='f1') metric.sort() metric_all['svm'] = metric[::-1] # 擬合隨機森林演算法 from sklearn.ensemble import RandomForestClassifier RF = RandomForestClassifier(n_estimators=30, criterion='gini', random_state=10) metric = cross_val_score(RF, X, Y, cv=10, scoring='f1') metric.sort() metric_all['RandomForest'] = metric[::-1] # 構造knn最近鄰模型 from sklearn import neighbors knn = neighbors.KNeighborsClassifier(n_neighbors=9, algorithm='kd_tree') metric = cross_val_score(estimator=knn, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['knn'] = metric[::-1] # 構造lda模型 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda = LinearDiscriminantAnalysis(solver='lsqr', shrinkage=None, priors=None) metric = cross_val_score(estimator=lda, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['lda'] = metric[::-1] # 構造qda模型 from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis qda = QuadraticDiscriminantAnalysis() metric = cross_val_score(estimator=qda, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['qda'] = metric[::-1] # 高斯樸素貝葉斯,多項式貝葉斯適用於文字分類,伯努利貝葉斯需要全部變數威二值變數 from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() metric = cross_val_score(estimator=gnb, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['gnb'] = metric[::-1] # sklearn提供了bp多層神經網路,隱含層設為 (4, 3, 2) from sklearn.neural_network import MLPClassifier mbp = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(4, 3, 2), random_state=1) metric = cross_val_score(estimator=mbp, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['mbp'] = metric[::-1] # 採用adaboost演算法 from sklearn.ensemble import AdaBoostClassifier # 弱分類器的引數 base_estimator 預設為決策樹 ada = AdaBoostClassifier(n_estimators=100) metric = cross_val_score(estimator=ada, X=X, y=Y, cv=10, scoring='f1') metric.sort() metric_all['ada'] = metric[::-1] # 將10種模型結果進行比較 print metric_all print "按照F1-score進行排序" metric_mean = metric_all.mean() print metric_mean.sort_values(ascending=False)
最終的結果如下:
glm tree svm RandomForest knn lda qda
0 0.788732 0.811594 0.756757 0.826667 0.760563 0.800000 0.733333
1 0.761905 0.800000 0.753623 0.800000 0.757576 0.761905 0.693333
2 0.732394 0.769231 0.705882 0.789474 0.750000 0.742857 0.685714
3 0.730159 0.760563 0.695652 0.782609 0.727273 0.735294 0.677419
4 0.716418 0.730159 0.677419 0.781250 0.724638 0.718750 0.676056
5 0.698413 0.730159 0.676056 0.741935 0.716418 0.687500 0.675000
6 0.677419 0.711864 0.675325 0.666667 0.714286 0.666667 0.649351
7 0.677419 0.707692 0.656250 0.634921 0.634921 0.666667 0.563636
8 0.666667 0.646154 0.622951 0.634921 0.579710 0.655738 0.530612
9 0.666667 0.634921 0.593750 0.606061 0.562500 0.645161 0.449438
gnb mbp ada
0 0.707692 0.786885 0.760563
1 0.704225 0.776119 0.760563
2 0.696970 0.742857 0.741935
3 0.688525 0.711864 0.738462
4 0.687500 0.701754 0.718750
5 0.677966 0.692308 0.709677
6 0.657534 0.690909 0.707692
7 0.586207 0.675325 0.676471
8 0.500000 0.654545 0.666667
9 0.466667 0.620690 0.666667
按照F1-score進行排序
tree 0.730234
RandomForest 0.726450
ada 0.714745
glm 0.711619
lda 0.708054
mbp 0.705326
knn 0.692788
svm 0.681367
gnb 0.637329
qda 0.633389