前提として、2クラス分類。 データに含まれる特徴量は
data_train.columns.values >> array(['feature1', 'feature2', 'feature3', 'feature4', 'feature5', 'feature6', 'feature7', 'feature8', 'feature9', 'feature10', 'feature11', 'feature12', 'feature13', 'feature14', 'feature15', 'feature16', 'feature17', 'feature18', 'feature19', 'feature20', 'feature21', 'target'], dtype=object)
となっていて target
を予測したい。
各特徴の分布を確認
箱ひげ図を使って母集団の大まかな分布を把握する
plt.title('BOX PLOT') ax = sns.boxplot(data=data_train, orient="h", palette="Set2")
特徴ごとに中央値が違うことがわかる。
目的値ごとに分布に違いがあるのかを確認する
plt.figure(figsize=(10, 10)) for i in range(20): plt.subplot(5, 4, i+1) sns.boxplot(y="feature"+str(i+1), x="target", data=data_train_times, palette="Set2") plt.tight_layout()
教師データの違いに対して分布の違いがないため、予測は困難そうとわかる。
2変数間の関係を見る
N = 2000 # プロットする点の数 pairplot_d = data_train.copy() randomdata = np.random.randint(1, data_train.shape[0], N) pairplot_d = pairplot_d.ix[randomdata, ('feature1', 'feature2', 'feature3', 'feature4', 'target')] sns.pairplot(pairplot_d, hue="target", palette="Set2", markers='x')
グラフが綺麗に分かれておらず、2変数の値を見ただけではクラス分類は難しそう。
等高線をプロットして分布を確認する
randomdata = np.random.randint(1, data_train.shape[0], N) plt.figure(figsize=(16, 10)) for i in range(20): # focus clm print 'kde step:', i plt.subplot(3, 7, i+1) focusa, focusb = 'feature1', 'feature'+str(i+2) pairplot_d = data_train.copy().ix[randomdata, (focusa, focusb, 'target')] # div data pairplot_d0 = pairplot_d[pairplot_d['target']==0] pairplot_d1 = pairplot_d[pairplot_d['target']==1] # kde sns.kdeplot(pairplot_d0[focusa], pairplot_d0[focusb], \ cmap="Reds", shade_lowest=False) sns.kdeplot(pairplot_d1[focusa], pairplot_d1[focusb], \ cmap="Blues", shade_lowest=False) plt.tight_layout()
ほとんどの分布が重なっているが、分布の山の位置に違いがわずかにある。 これを強調するように前処理を重ねていく。