pandasの使い方とか

普段pythonもpandasもscikit-learnも使ってないのでチートシート的にまとめておきたい

随時更新していく

ファイルの読み込み

train = pd.read_csv('train.csv')

欠損値の確認

total = train.isnull().sum().sort_values(ascending=False)
ratio = total / train.shape[0]
missing = pd.concat([total, ratio], axis=1, keys=['total', 'ratio'])

列の除去

あまりにも欠損値が多い列を消す時とか

train2 = train.drop(['Cabin'], axis=1)
# trainを上書きしてしまっていいなら下記でも良い
train.drop(['Cabin'], axis=1, inplace=True)

条件を満たす行の除去

学習データで数行だけ欠損値があって学習時にそれらを無視したい時とか

train = train.drop(train.loc[train['Embarked'].isnull()].index)

locの使い方

列名、行名(index) か、列のboolean, 行のboolean でDataFrameの一部を取得できる df.loc[行, 列]

# 行(index指定)
train.loc[19]

# 行(index複数指定)
train.loc[[9, 19]]

# 条件 (行)
train.loc[train['Embarked'].isnull()]

# 列名
train.loc[:, 'Name']

# 列名(複数)
train.loc[:, ['Name', 'Age']]

カテゴリカル -> ダミー変数 への変換

dummy_sex = pd.get_dummies(train.Sex, drop_first=True)

train2 = pd.merge(train, dummy_sex, left_index=True, right_index=True)

列名の変更

train.rename(columns={'Q': 'Embarked_Q', 'S': 'Embarked_S'}, inplace=True)

バリデーション用のデータを分ける

from sklearn.model_selection import train_test_split
x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1, random_state=0)

パラメータのグリッドサーチ

from sklearn.ensemble import RandomForestClassifier
from sklearn.grid_search import GridSearchCV

tune_params = {
    'n_estimators': [1, 10, 50, 100, 500, 1000],
    'random_state': [100]
}

clf = GridSearchCV(
    RandomForestClassifier(), # 識別器
    tune_params, # 最適化したいパラメータセット 
    cv=5, # 交差検定の回数
    scoring='accuracy' ) 

clf.fit(x_train, y_train)

# 確認
clf.grid_scores_

バリデーション用データで評価してみる

clf.best_estimator_.score(x_valid, y_valid)

正規化

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(x_train) # ホントはx_combined的なものでfitさせたほうが良さそう
x_train_scaled = scaler.transform(x_train)