1. 程式人生 > >python pandas 基本使用,sklearn的10種分類器實踐

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