Kaggle入門第一課-Titanicインスタンス解析
15758 ワード
このkernelのソースは次のとおりです.https://www.kaggle.com/helgejo/an-interactive-data-science-tutorialこの例の解析を記録し,pythonを用いた簡単な機械学習練習を学習することを目的とする.本文は更に分析の流れを重視して、モデリング部分はただ1種の機械学習モデルを使って、異なるモデルを運用してモデリングする方法は類似しています.
ライブラリファイルのインポート
モデリング支援Modelling Helpers
機能関数:
データのロード:
統計情報セクションとデータの可視化:
データプリプロセッシング:
新しいフィーチャーを抽出するには、次の手順に従います.観光客の名前から呼称を抽出する:用.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トレーニングセットとテストセット:
(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がかなり低い場合は、今回のモデリングが過度にフィットしていることを示し、 フィーチャーの重要性:
結果の公開
返される結果は2列であり,1列は乗客IDであり,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. -
新しいフィーチャーを抽出するには、次の手順に従います.
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)#トレーニングセット(フィーチャー+結果)
評価
# ,
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 ) #