Kaggle入門第一課-Titanicインスタンス解析

15758 ワード

このkernelのソースは次のとおりです.https://www.kaggle.com/helgejo/an-interactive-data-science-tutorialこの例の解析を記録し,pythonを用いた簡単な機械学習練習を学習することを目的とする.本文は更に分析の流れを重視して、モデリング部分はただ1種の機械学習モデルを使って、異なるモデルを運用してモデリングする方法は類似しています.
ライブラリファイルのインポート
#     Ignore warnings
import warnings
warnings.filterwarnings('ignore')


#             Handle table-like data and matrices
import numpy as np
import pandas as pd

#      ,     sklearn Modelling Algorithms
from sklearn.tree import DecisionTreeClassifier #   
from sklearn.linear_model import LogisticRegression #    
from sklearn.neighbors import KNeighborsClassifier #k  
from sklearn.naive_bayes import GaussianNB #  
from sklearn.svm import SVC, LinearSVC        
from sklearn.ensemble import RandomForestClassifier , GradientBoostingClassifier #      ,      

モデリング支援Modelling Helpers
from sklearn.preprocessing import Imputer , Normalizer , scale
#http://blog.csdn.net/sinat_33761963/article/details/53433799               ,imputer  ,   ,    
from sklearn.cross_validation import train_test_split , StratifiedKFold 

#          ,import:               ,StratifiedKFold k-Fold   ,       :                        。http://blog.csdn.net/Mr_tyting/article/details/73440712

from sklearn.feature_selection import RFECV
#          ,      ,        ,      ,             

#    Visualisation
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import seaborn as sns
#matplotlib      pylot     MATLAB   APIpylab     Numpy pylot        ,           ,     numpy、pylot      。seaborn    matplotlib           API  ,          

#      Configure visualisations
%matplotlib inline
# ipython        , %         。      
mpl.style.use( 'ggplot' )#    
sns.set_style( 'white' )
pylab.rcParams[ 'figure.figsize' ] = 8 , 6 #      ,          。http://blog.csdn.net/iamzhangzhuping/article/details/50792208

機能関数:
#    
def plot_histograms( df , variables , n_rows , n_cols ):
    fig = plt.figure( figsize = ( 16 , 12 ) )
    for i, var_name in enumerate( variables ):
        ax=fig.add_subplot( n_rows , n_cols , i+1 )
        df[ var_name ].hist( bins=10 , ax=ax )
        ax.set_title( 'Skew: ' + str( round( float( df[ var_name ].skew() ) , ) ) ) # + ' ' + var_name ) #var_name+" Distribution")
        ax.set_xticklabels( [] , visible=False )
        ax.set_yticklabels( [] , visible=False )
    fig.tight_layout()  # Improves appearance a bit.
    plt.show()

#    ,var   ,target   ,kwargs     ,    plot_distribution(titanic,var='Fare',target='Survived',row='Sex'),            ,    2    ,    。
def plot_distribution( df , var , target , **kwargs ):
    row = kwargs.get( 'row' , None )
    col = kwargs.get( 'col' , None )#      
    facet = sns.FacetGrid( df , hue=target , aspect=4 , row = row , col = col )
    facet.map( sns.kdeplot , var , shade= True )
    facet.set( xlim=( 0 , df[ var ].max() ) )
    facet.add_legend()
#    ,               
def plot_categories( df , cat , target , **kwargs ):
    row = kwargs.get( 'row' , None )
    col = kwargs.get( 'col' , None )
    facet = sns.FacetGrid( df , row = row , col = col )
    facet.map( sns.barplot , cat , target )
    facet.add_legend()

def plot_correlation_map( df ):
    corr = titanic.corr()
    _ , ax = plt.subplots( figsize =( 12 , 10 ) )
    cmap = sns.diverging_palette( 220 , 10 , as_cmap = True )
    _ = sns.heatmap(
        corr, 
        cmap = cmap,
        square=True, 
        cbar_kws={ 'shrink' : .9 }, 
        ax=ax, 
        annot = True, 
        annot_kws = { 'fontsize' : 12 }
    )

def describe_more( df ):
    var = [] ; l = [] ; t = []
    for x in df:
        var.append( x )
        l.append( len( pd.value_counts( df[ x ] ) ) )
        t.append( df[ x ].dtypes )
    levels = pd.DataFrame( { 'Variable' : var , 'Levels' : l , 'Datatype' : t } )
    levels.sort_values( by = 'Levels' , inplace = True )
    return levels
#        
def plot_variable_importance( X , y ):
    tree = DecisionTreeClassifier( random_state = 99 )
    tree.fit( X , y )
    plot_model_var_imp( tree , X , y )

def plot_model_var_imp( model , X , y ):
    imp = pd.DataFrame( 
        model.feature_importances_  , 
        columns = [ 'Importance' ] , 
        index = X.columns 
    )
    imp = imp.sort_values( [ 'Importance' ] , ascending = True )
    imp[ : 10 ].plot( kind = 'barh' )
    print (model.score( X , y ))

データのロード:
#   csv   DF   get titanic & test csv files as a DataFrame
train = pd.read_csv("../input/train.csv")
test    = pd.read_csv("../input/test.csv")
full = train.append( test , ignore_index = True )#       
titanic = full[ :891 ]
del train , test
print ('Datasets:' , 'full:' , full.shape , 'titanic:' , titanic.shape)

統計情報セクションとデータの可視化:
titanic.head()#   5   
titanic.describe()#    ,                    
plot_correlation_map( titanic )#          
plot_distribution( titanic , var = 'Age' , target = 'Survived' , row = 'Sex' )#  、       
plot_categories( titanic , cat = 'Embarked' , target = 'Survived' )#                     

データプリプロセッシング:
1.              
 pd.Series()   1 0     。 n  (n>2)   , pd.get_dummies()   n   。
2.        
         。                  。    DataFrame full.Age.fillna(full.Age.mean())   full Age    。
3.      -     

新しいフィーチャーを抽出するには、次の手順に従います.
  • 観光客の名前から呼称を抽出する:用.map( lambda name: name.split( ‘,’ )[1].split( ‘.’ )[0].strip()は名前--分割された名前をマッピングします.呼称分類の辞書を作成します.呼び方とこの辞書をマッピングします.すなわち、呼び方を分類します.Get_dummies関数はn列のデータを分割します.pd.concatはテーブルを接続するために使用されます.
  • Ticket番号から倉庫を抽出する:Ticketに対してデータクリーンアップticket[‘Ticket’]=full[‘Ticket’]を行う.map(cleanTicket)、cleanTicket関数は各行のticketデータを処理し、split分割文字列はlistとなり、stripは1つの文字列の前後のスペースを取り除き、filterは非純数字の文字列を保持し、純数字のlist長さは複数となり、文字列の先頭文字を返すことができ、非文字列のすべてはXXXである.各ticketの値をこの関数にマッピングし、get_dummiesはn列のデータを分割します.
  • 家族数抽出:df構造のデータは直接累積することができ、mapで累積した結果を分類し、get_dummies分割行.
  • すべての特徴のdataset総和:pd.concatトレーニングセットとテストセット:
  • train_valid_X = full_X[ 0:891 ] #full_X    1309     (  891          481          )
    train_valid_y = titanic.Survived #titanic  891       
    test_X = full_X[ 891: ] #   481        
    train_X , valid_X , train_y , valid_y = train_test_split( train_valid_X , train_valid_y , train_size = .7 )#            
    print (full_X.shape , train_X.shape , valid_X.shape , train_y.shape , valid_y.shape , test_X.shape)

    (1309,15)(623,15)(268,15)(623)(268)(418,15)説明:バンドXは15列の特徴を表し、バンドyはSurvivedを表す結果を得た.この二つを別々に区分する.そしてtrain_X&train_yはトレーニングモデルに使用され、valid_X&valid_yモデルのパフォーマンスを検証するために使用します.要件を満たす場合は、test_にモデルを適用できます.Xテストセットから予測結果が得られた.train_X , valid_X , train_y , valid_y = train_test_split( train_valid_X , train_valid_y , train_size = .7 ) train_X:トレーニングセットX 70%+valid_X:検証セットX 30%=train_valid_X 890条特徴データtrain_y:トレーニングセットy 70%+valid_y:検証セットy 30%=train_valid_y 890件結果train_size:トレーニングセットが総集合に占める割合モデリング&トレーニングモデルモデルモデル=LogisticRegression()モデル.fit(train_X,train_y)#トレーニングセット(フィーチャー+結果)
    評価
  • モデル表現:print(model.score(train_X,train_y),model.score(valid_X,valid_y)#前者はトレーニングセット(フィーチャー+結果)、後者は検証セット(フィーチャー+結果)であり、後者と前者のscoreを比較すると、前者に基づいてモデリングされているため、後者のscoreがかなり低い場合は、今回のモデリングが過度にフィットしていることを示し、
  • フィーチャーの重要性:
  • #           ,   
    plot_model_var_imp(model, train_X, train_y)
    #         
    rfecv = RFECV( estimator = model , step = 1 , cv = StratifiedKFold( train_y , 2 ) , scoring = 'accuracy' )
    rfecv.fit( train_X , train_y )
    #        
    #print (rfecv.score( train_X , train_y ) , rfecv.score( valid_X , valid_y ))
    #print( "Optimal number of features : %d" % rfecv.n_features_ )
    
    # Plot number of features VS. cross-validation scores
    #plt.figure()
    #plt.xlabel( "Number of features selected" )
    #plt.ylabel( "Cross validation score (nb of correct classifications)" )
    #plt.plot( range( 1 , len( rfecv.grid_scores_ ) + 1 ) , rfecv.grid_scores_ )
    #plt.show()

    結果の公開
    返される結果は2列であり,1列は乗客IDであり,1列は本明細書のモデルに基づいて予測された生還結果である.
    test_Y = model.predict( test_X ) #    400     
    passenger_id = full[891:].PassengerId # 
    test = pd.DataFrame( { 'PassengerId': passenger_id , 'Survived': test_Y } ) #   df   
    test.shape #  
    test.head()
    test.to_csv( 'titanic_pred.csv' , index = False ) #