データ分析コンペとかによくやる作業

May 3, 2019   #python 

大きいデータの読み込み

daskを使って並列処理

import dask.dataframe as ddf
import dask.multiprocessing

df = ddf.read_csv('train_data.csv')
df = df.compute(get=dask.multiprocessing.get)

EDA

データに関する簡単な統計情報確認

import pandas_profiling as pdp
pdp.ProfileReport(df)

データの相関を確認

import seaborn as sns
sns.pairplot(df, hue="target", diag_kind="kde")

前処理

  • 欠損値の補完
  • 外れ値の削除
  • カテゴリ変数の扱い
    • one hot encoding (次元増える系)
      • どれかひとつだけ1になるようなスパースなベクトル表現
    city_dummies = pd.get_dummies(df["city"], prefix="city")
    df.drop(["city"], axis=1, inplca=True)
    df = df.join(city_dummies)
    
    • count encoding (次元増えない系)
      • カテゴリ変数の出現回数(あるいは率)を値とするような表現
    df['count_city'] = df.groupby('city')['target'].transform('count')
    
  • 並列処理
    import numpy as np
    import pandas as pd
    #import multiprocessing as mp  # impossible to use lambda with pickle
    import pathos.multiprocessing as mp  # dill is used inside instead of pickle.
    
    def split_parallel(df, num_split, map_func):
        with mp.Pool(num_split) as p:
            df_split = np.array_split(df, num_split*2)
            result = p.map(map_func, df_split)
        return pd.concat(result)
    
    NUM_PARALLELS = 3
    df["new_col"] = split_parallel(df, NUM_PARALLELS, lambda x: x["col1"] + x["col2"])
    

CV

from sklearn.model_selection import StratifiedKFold

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=123)
X_train = np.zeros(20, 5)
y_train = np.zeros(20)

for train_idx, valid_idx in cv.split(X_train, y_train):
    print(train_idx, valid_idx)
    ...
    losses.append(loss)

cv_loss = np.mean(losses)

結果のアンサンブル

res1 = pd.read_csv('../method1/submission.csv')
res2 = pd.read_csv('../method2/submission.csv')
res3 = pd.read_csv('../method3/submission.csv')

b1 = res1.copy()
col = res1.columns

col = col.tolist()
col.remove('id')
for i in col:
    b1[i] = (2 * res1[i]  + 2 * res2[i] + 4 * res3[i]) / 6.0

b1.to_csv('submission.csv', index=False)

Jupyter Notebook上でCSVの確認とダウンロード

実行するとディレクトリ内のファイル一覧が表示されて、クリックすればダウンロード出来るはず

from IPython.display import FileLinks
FileLinks(DATA_DIR)