データ分析手順

Kaggleで三日間遊んで学んだことです。
自分用のためにまとめました。

- 課題：分類・回帰（NumericalとCategorical featuresのみ、画像はまだ調べていないです。）
- 流れ
    - preprocessing (欠損値の処理、featuresの選択、Categorical featuresのエンコーディング)
    - modeling
    - CV,Ensemble
- ツール(メイン)：pandas,numpy,seaborn,matplotlib,sklearn

##前処理preprocessing

前処理については、[hirai.me](http://hirai.me/notes_pyml_04.html#)はとても参考になります。

###データの確認

#####まずデータをチャックします。

```
df_train = pd.read_csv("train.csv")

df_train.head() #最初の5行を確認
df_train.info() #データの欠損値、型、columnsを確認
df.describe() #Numericalデータの統計情報
df.describe(include=['O']) #Categoricalデータの統計情報
```

#####次は図でデータの分布を確認します。
基本的には、seabornを使います。

- Catagorical features(分類)

```
data = df_train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
f, ax = plt.subplots(figsize=(6, 4))
fig = sns.barplot(x='Pclass', y='Survived', palette="Set3", data=data)
fig.axis(ymin=0, ymax=1)
```
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/144971/c079291c-312b-826d-fc92-baad127f8a91.png)

- Catagorical features(回帰)

```
data = pd.concat([df_train['SalePrice'], df_train["MSZoning"]], axis=1)
f, ax = plt.subplots(figsize=(6, 4))
fig = sns.boxplot(x="MSZoning", y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
```
![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/144971/cb902354-2dd8-e5d2-f178-b449d09d2859.png)

- Numerical features(分類)

```
g = sns.FacetGrid(df_train, col='Survived')
g.map(plt.hist, 'Age', bins=20, color="steelblue")
```
![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/144971/bb724852-1982-9c77-9a42-53f5fab76a0d.png)

#####相関性を確認します

```
corrmat = df_train.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
```

![ダウンロード (3).png](https://qiita-image-store.s3.amazonaws.com/0/144971/b517c3c4-36e1-e754-ed00-59f3fe87e95d.png)

###欠損値の処理


```
#捨てる
df_train= df_train.dropna()

#平均値で埋め込む
m = np.nanmean(np.concatenate([df_train["Fare"].values,df_test["Fare"].values], axis=0))
X['Fare'] = X['Fare'].fillna(m)

#ほかの処理方法．．．
```

###特徴の選択

ここは職人の世界です。
まだいろいろ勉強しているんです。

よく使われる方法は、例えば、RandomForestでfeature_importances_が小さいカラムを捨てる。

```
random_forest = RandomForestClassifier(n_estimators=100, class_weight='balanced')
random_forest.fit(X_train, y_train)

#図で確認
plt.figure(figsize = ( 20 , 20 ))
plt.barh(range(44), random_forest.feature_importances_)
plt.yticks(range(44), df_train.columns.values[1:])

# drop
df_train_01 = df_train.drop(["特定の列"],axis=1)
```

![tete.png](https://qiita-image-store.s3.amazonaws.com/0/144971/38768a50-fffe-5512-5348-cc1f0f5f394a.png)


###エンコーディング

基本はone-hotで処理します。

```
X = pd.get_dummies(X)　#一番簡単な方法
```

順序があるデータに対しては、マッピング処理もOK

```
street_mapping = {'Grvl': 2, 'Pave': 1}
df['Street'] = df['Street'].map(street_mapping)
```

###正規化

必要がない場合もあります。

```
from sklearn.preprocessing import StandardScaler
mms = StandardScaler()
X_train_std = mms.fit_transform(X_train)
X_test_std = mms.transform(X_test)
```

---

以上までの一部コードは[Classification](http://gotomountains.com/study/datascience/Classification_Demo.html)と[Regression](http://gotomountains.com/study/datascience/Regression_Demo.html)に参考可能です。

##Modeling

###分類
RandomForestClassifier, KNeighborsClassifier, DecisionTreeClassifierなどいろんな手法があります。
sklearnのドキュメントで確認可能です。

例

```
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
```

###回帰
LinearRegression, RidgeCV, LassoCVなどいろんな手法があります。
sklearnのドキュメントで確認可能です。

例

```
lr = LinearRegression()
lr.fit(X_train, y_train)
y_train_pred = lr.predict(X_train)
```

###GridRearch
パラメータ調整不可欠な方法です。

例

```
clf =xgb.XGBRegressor()

#GridSearch
clf_cv = GridSearchCV(clf, {'n_estimators':[50,100,150]})
clf_cv.fit(X_train, y_train)
clf_cv.best_params_, clf_cv.best_score_

#best_params_を適用
clf = xgb.XGBRegressor(**clf_cv.best_params_)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
```

###xgboost
今、kaggleで一番流行っている手法？

windowsでのインストールについては、直接pip installはエラーになります。
[http://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost](http://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost) のバージョンはインストール可能です。
もしくは、[HP](https://xgboost.readthedocs.io/en/latest/build.html#building-on-windows)の手順通り、mingw64を経由でインストールしてください。

使用方法は、sklearn経由か、xgboostで学習するか、どっちでもOKです

sklearnでは[ここ](https://qiita.com/msrks/items/e3e958c04a5167575c41#_reference-95e877546cf91e305b48)に参考可能です。

xgboostで学習する場合はこんな感じです。

```
d_train = xgb.DMatrix(X_train, y_train)
d_test = xgb.DMatrix(test.values)
watchlist = [(d_train, 'train')]
mdl = xgb.train(params, d_train, 1600, watchlist, early_stopping_rounds=70, maximize=True, verbose_eval=100)
p_test = mdl.predict(d_test, ntree_limit=mdl.best_ntree_limit)
```

モデリングももちろん職人の世界です。パラメータの調整、モデルの選択等々は、経験から積み重ねるしかありません。

##CV,Ensemble

まだいろいろ試している途中です。
Kaggleで高い順位を獲得するため、不可欠な部分です。

###交差検証Cross Validation

sklearnでは、StratifiedKFoldというメソッドがあります。

使用例

```
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, random_state=23)

for train_index, test_index in skf.split(X, y):
    X_train = X[train_index]
    y_train = y[train_index]
    
    d_train = xgb.DMatrix(X_train, y_train)
    d_test = xgb.DMatrix(test.values)
    watchlist = [(d_train, 'train')]
    
    mdl = xgb.train(params, d_train, 1600, watchlist, early_stopping_rounds=70, feval=gini_xgb, maximize=True, verbose_eval=100)
    
    p_test = mdl.predict(d_test, ntree_limit=mdl.best_ntree_limit)
    result += p_test/5

```

###Ensemble

[Wiki-Ensemble_learning](https://en.wikipedia.org/wiki/Ensemble_learning)
複数モデルをアンサブルする方法です。
また職人の世界です。（笑）

[mlxtend](http://rasbt.github.io/mlxtend/)というlibがあります。
これを使って、簡単にアンサブルできます。

使用例

```
import xgboost as xgb
from sklearn.ensemble import RandomForestRegressor,ExtraTreesRegressor,GradientBoostingRegressor
from mlxtend.regressor import StackingCVRegressor

reg1 = RandomForestRegressor(n_estimators=100, random_state=23)
reg2 = ExtraTreesRegressor(n_estimators=100, random_state=23)
reg3 = GradientBoostingRegressor(n_estimators=100, random_state=23)
reg4 = xgb.XGBRegressor(max_depth=2,n_estimators=100,objective='binary:logistic',subsample=0.5)

stregr = StackingCVRegressor(regressors=[reg1, reg2, reg3, reg4],  meta_regressor=reg4)
stregr.fit(X_train_std, y_train)
y_pred = stregr.predict(X_test_std)
```


---
まだデータサイエンス世界の初心者です。kaggleという強者の集まる場から、少しでも勉強できたら幸いです。

そいえば、今参加しているコンペティションはまだ1100位ぐらいですけど、終了前には1000位に入るのは目標です。