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

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) ```