前提・実現したいこと
scikit-learnを用いたデータ分析の前処理
私は現在scikit-learnを用いてデータ分析の学習をしています。現在はSIGNATEのプラクティスコンペティションで学習しています。
元データのサイト
元データは規約上貼れないことをお許しください。
また、この問題は分類問題です。
発生している問題・エラーメッセージ
現在はニューラルネットワークを用いて学習させたところ0.7前後の精度となっています。そこで、前処理としてpreprocessingクラスにあるMinMaxScalerとStandaerdScalerを使用したところ精度が0.7を割る値になりました。
該当のソースコード
Python3
1import pandas as pd 2import sklearn 3 4#csvからの読み込み 5train = pd.read_csv('./train.csv', index_col=0) 6test = pd.read_csv('./test.csv', index_col=0) 7 8#欠損値を文字列からNoneへと変換 9dict_none = {'unknown': None} 10train = train.replace(dict_none) 11test = test.replace(dict_none) 12 13#テストデータに対するダミー変数 14dummy = pd.get_dummies(train["job"], prefix="job") 15train = train.drop("job", axis=1).join(dummy) 16dummies = pd.get_dummies(train["marital"], prefix="marital") 17train = train.drop("marital", axis=1).join(dummies) 18dummies = pd.get_dummies(train["education"], prefix="edu") 19train = train.drop("education", axis=1).join(dummies) 20dummies = pd.get_dummies(train["default"], prefix="default") 21train = train.drop("default", axis=1).join(dummies) 22dummies = pd.get_dummies(train["housing"], prefix="housing") 23train = train.drop("housing", axis=1).join(dummies) 24dummies = pd.get_dummies(train["loan"], prefix="loan") 25train = train.drop("loan", axis=1).join(dummies) 26dummies = pd.get_dummies(train["contact"], prefix="contact") 27train = train.drop("contact", axis=1).join(dummies) 28dummies = pd.get_dummies(train["poutcome"], prefix="poutcome") 29train = train.drop("poutcome", axis=1).join(dummies) 30dict_week = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6, "jul": 7, "aug": 8, "sep": 9, "oct": 10, "dec": 11, "nov": 12} 31train["month"] = train["month"].replace(dict_week) 32 33#テストデータに対するダミー変数 34dummy = pd.get_dummies(test["job"], prefix="job") 35test = test.drop("job", axis=1).join(dummy) 36dummies = pd.get_dummies(test["marital"], prefix="marital") 37test = test.drop("marital", axis=1).join(dummies) 38dummies = pd.get_dummies(test["education"], prefix="edu") 39test = test.drop("education", axis=1).join(dummies) 40dummies = pd.get_dummies(test["default"], prefix="default") 41test = test.drop("default", axis=1).join(dummies) 42dummies = pd.get_dummies(test["housing"], prefix="housing") 43test = test.drop("housing", axis=1).join(dummies) 44dummies = pd.get_dummies(test["loan"], prefix="loan") 45test = test.drop("loan", axis=1).join(dummies) 46dummies = pd.get_dummies(test["contact"], prefix="contact") 47test = test.drop("contact", axis=1).join(dummies) 48dummies = pd.get_dummies(test["poutcome"], prefix="poutcome") 49test = test.drop("poutcome", axis=1).join(dummies) 50dict_week = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6, "jul": 7, "aug": 8, "sep": 9, "oct": 10, "dec": 11, "nov": 12} 51test["month"] = test["month"].replace(dict_week) 52 53from sklearn.preprocessing import MinMaxScaler 54ms = MinMaxScaler() 55 56X = ms.fit_transform(train.drop('y', axis=1)) 57y = train['y'].values 58 59from sklearn.neural_network import MLPClassifier 60clf = MLPClassifier() 61clf.fit(X, y) 62 63X = ms.fit_transform(test) 64p = clf.predict(X) 65pd.DataFrame(p, index=test.index).to_csv('./output.csv', header=False) 66
試したこと
まずはじめに文字列の含まれる列を全てダミー変数へと置き換えました。その精度は0.7前後でした。そこで、Yes,Noの2値化出来る列を0,1に置き換えMinMaxScalerメソッドを施したところ精度は0.7を割り0.68前後となりました。
次に元データでは欠損値が'unknown'なのでNoneへと変換し欠損値をわかりやすくしました。その後、dropnaメソッドを用いて欠損値のある行を全て消去したところ精度は0.7未満となりました。
このように前処理を施すとどんどん精度が下がる結果となってしまっています。
補足情報(FW/ツールのバージョンなど)
Python 3.6.5
Scikit-Learn 0.19.1
Pandas 0.22.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/13 03:00
2018/05/13 03:25
2018/05/13 15:32