質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

995閲覧

機械学習 test結果がおかしい

aki123

総合スコア13

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/31 14:42

編集2020/02/01 01:52

Python(Jupyter Notebook)で機械学習の二値分類の課題を行っています。
複数のアルゴリズムでTestとTrainを実施したのですが、testがTrainより良くなり、しかも多くのTestが1.0という結果になります(添付参照)。※データは練習用として適当に作成。
こういったことはあり得るのでしょうか?それとも高い可能性で途中のコードに間違いがあるものでしょうか?イメージ説明

下記にコードを記載いたします。まだ初心者のため、同じコードを書いたり、見にくいと思いますが、どうぞご容赦いただけたらと思います。
データは一部のみですが、添付します。leftが目的変数となります。イメージ説明

Python

1# salaryとsalesのデータの型をobjectで統一している 2# import sample data: Loan screening data for classification 3ohe_columns = ['sales', 4 'salary'] 5my_dtype = {'sales':object, 6 'salary':object} 7 8import pandas as pd 9 10df = pd.read_csv('./data/finaldayP.csv',header=0, dtype=my_dtype) 11X = df.iloc[:,[0,2,3,4,5,6,7,8,9,10]] # 最終列以前を特徴量X 12X = X.drop('index',axis=1)# 1列目はID情報のため特徴量から削除 13y = df.iloc[:,1] # 2番目を正解データ 14 15# check the shape 16print('X shape: (%i,%i)' %X.shape) 17 18print('--------------------') 19print(y.value_counts()) 20X.join(y).head() 21 22#カテゴリカル変数のohe化 23 24 25 26X_new = pd.get_dummies(X, 27 dummy_na=True, 28 columns=ohe_columns) 29 30display(X_new.head()) 31print(X_new.shape) 32 33X_new.describe() 34 35from sklearn.impute import SimpleImputer 36 37# インピュータークラスのインスタンス化と(列平均の)学習 imputerは欠損値を平均値や中央値で保管する 38imp = SimpleImputer() 39imp.fit(X_new) 40 41# 学習済みImputerの適用:各列の欠損値の置換  前処理の時はtransform (Predictではない) 42X_ohe_columns = X_new.columns.values 43X_ohe = pd.DataFrame(imp.transform(X_new),columns=X_ohe_columns) 44X=X_ohe 45# 結果表示 46display(X.head()) 47 48# スコアデータの読み込み 49import pandas as pd 50 51df_s = pd.read_csv('./data/finaldayPtest.csv',header=0, dtype=my_dtype) 52X_s = df_s.iloc[:,[0,2,3,4,5,6,7,8,9,10]] 53X_s = X_s.drop('index',axis=1) 54y_s = df_s.iloc[:,1] 55 56# check the shape 57print('Raw shape: (%i,%i)' %df_s.shape) 58print('X shape: (%i,%i)' %X_s.shape) 59print('-------------------------------') 60print(X_s.dtypes) 61 62#スコア用データの前処理:カテゴリ変数の数量化と欠損対応 63X_ohe_s = pd.get_dummies(X_s, 64 dummy_na=True, 65 columns=ohe_columns) 66print('X_ohe_s shape:(%i,%i)' % X_ohe_s.shape) 67X_ohe_s.head() 68 69# Pythonの集合型変数を利用 setを用いることによって差異を見ることができる 70cols_model = set(X_ohe.columns.values) 71cols_score = set(X_ohe_s.columns.values) 72 73# モデルにはあったスコアにはないデータ項目 74diff1 = cols_model - cols_score 75print('Modelのみ:%s' % diff1) 76 77# スコアにはあるがモデルになかったデータ項 78diff2 = cols_score - cols_model 79print('Scoreのみ:%s' % diff2) 80 81 82df_cols_m = pd.DataFrame(None, 83 columns=X_ohe_columns, 84 dtype=float) 85display(df_cols_m) 86 87X_ohe_s2 = pd.concat([df_cols_m, X_ohe_s]) 88print(X_ohe_s2.shape) 89display(X_ohe_s2.head(3)) 90 91#スコアリングにあるが、モデルにない特徴量を削除 92set_Xm = set(X_ohe.columns.values) 93set_Xs = set(X_ohe_s.columns.values) 94 95X_ohe_s3 = X_ohe_s2.drop(list(set_Xs-set_Xm),axis=1) 96 97print(X_ohe_s3.shape) 98display(X_ohe_s3.head(3)) 99 100 101X_ohe_s3.loc[:,list(set_Xm-set_Xs)] = X_ohe_s3.loc[:,list(set_Xm-set_Xs)].fillna(0,axis=1) 102X_ohe_s3.head(3) 103 104#reindex関数を使うことによって並びを制御。 105X_ohe_s3 = X_ohe_s3.reindex(X_ohe.columns.values,axis=1) 106X_ohe_s3.head(3) 107 108# isnullが欠損地でそのyes, noをカウントして欠損個数を表示している 109print('欠損個数(数値変数の欠損補完前)',X_ohe_s3.isnull().sum().sum()) 110X_ohe_s4 = pd.DataFrame(imp.transform(X_ohe_s3),columns=X_ohe_columns) 111print('欠損個数(数値変数の欠損補完後)',X_ohe_s4.isnull().sum().sum()) 112 113X_fin_s = X_ohe_s4 114print(X_fin_s.shape) 115X_fin_s.head(3) 116 117X.join(y).head() 118from sklearn.metrics import accuracy_score 119# import libraries 120import numpy as np 121import pandas as pd 122from sklearn.model_selection import train_test_split 123from sklearn.neighbors import KNeighborsClassifier 124from sklearn.linear_model import LogisticRegression 125from sklearn.preprocessing import StandardScaler 126from sklearn.pipeline import Pipeline 127from sklearn.svm import SVC, LinearSVC 128from sklearn.tree import DecisionTreeClassifier 129from sklearn.ensemble import RandomForestClassifier 130from sklearn.ensemble import GradientBoostingClassifier 131from sklearn.neural_network import MLPClassifier 132from sklearn.pipeline import Pipeline 133 134 135# Holdout 136X_train,X_test,y_train,y_test = train_test_split(X, 137 y, 138 test_size=0.20, 139 random_state=1) 140# set pipelines for two different algorithms 141pipelines ={ 142 'knn': Pipeline([('scl',StandardScaler()), 143 ('est',KNeighborsClassifier())]), 144 145 'logistic': Pipeline([('scl',StandardScaler()), 146 ('est',LogisticRegression(random_state=1))]), 147 'rsvc': 148 Pipeline([('scl',StandardScaler()), 149 ('est',SVC(C=1.0, kernel='rbf', class_weight='balanced', random_state=1))]), 150 'lsvc': 151 Pipeline([('scl',StandardScaler()), 152 ('est',LinearSVC(C=1.0, class_weight='balanced', random_state=1))]), 153 'tree': 154 Pipeline([('scl',StandardScaler()), 155 ('est',DecisionTreeClassifier(random_state=1))]), 156 'rf': 157 Pipeline([('scl',StandardScaler()), 158 ('est',RandomForestClassifier(random_state=1))]), 159 'gb': 160 Pipeline([('scl',StandardScaler()), 161 ('est',GradientBoostingClassifier(random_state=1))]), 162 'mlp': 163 Pipeline([('scl',StandardScaler()), 164 ('est',MLPClassifier(hidden_layer_sizes=(3,3), 165 max_iter=1000, 166 random_state=1))]) 167} 168 169# fit the models 170for pipe_name, pipeline in pipelines.items(): 171 pipeline.fit(X_train,y_train) 172 print(pipe_name, ': Fitting Done') 173print(X.shape) 174print(y.shape) 175 176 177from sklearn.metrics import f1_score 178scores = {} 179for pipe_name, pipeline in pipelines.items(): 180 scores[(pipe_name,'train')] = accuracy_score(y_train, pipeline.predict(X_train)) 181 scores[(pipe_name,'test')] = accuracy_score(y_test, pipeline.predict(X_test)) 182 183pd.Series(scores).unstack()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/01 00:15

コードがないと誰も何も言いようがありませんので、まずはコードを乗せた方が良いと思います。どこかでデータの入れ違いが起きているのが一番怪しいですが…
meg_

2020/02/01 01:07

上記情報だけでは分かりません。実際のデータ(一部で可)とコードを掲載ください。
guest

回答2

0

自己解決しました。
(厳密には外部からのアドバイス)

とりいそぎ、さっと自分で作ったデータだったため、件数が少ないことが原因でした。
Train 0.8、Test 0.2でわけましたが、20件程度だったため、Testが4つしかない。
結果、1.0が多くなったと理解できました。
ありがとうございました。

投稿2020/02/01 02:29

aki123

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

自己解決しました。
(外部からのアドバイス)

とりいそぎ、さっと自分で作ったデータだったため、件数が少ないことが原因でした。
Train 0.8、Test 0.2でわけましたが、20件程度だったため、Testが4つしかない。
結果、1.0が多くなったと理解できました。
ありがとうございました。

投稿2020/02/01 02:27

aki123

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問