普段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)