表題の件で質問させてください
現在こちらの書籍を読みながら機械学習の勉強を進めています
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
その中で交差検証について学習しているのですが分からない箇所があります
データセットの分割は訓練セット、検証セット、テストセットに分けて、
モデルのチューニングには検証セットを使い、テストセットはモデルの最終評価にのみ使うという記述があり、こちらは理解出来ました
以下訓練セット、検証セット、テストセットに分けてのモデル作成
python
1 2from sklearn.model_selection import cross_val_score 3from sklearn.datasets import load_iris 4from sklearn.linear_model import LogisticRegression 5from sklearn.model_selection import train_test_split 6from sklearn.model_selection import StratifiedKFold #層化k分割交差検証 7from sklearn.model_selection import KFold #k分割交差検証 8from sklearn.svm import SVC 9import numpy as np 10 11## データを(訓練セット+検証セット)とテストセットに分割する 12X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0) 13print(X_trainval.shape) 14print(X_test.shape) 15print(y_trainval.shape) 16print(y_test.shape) 17 18print('-------------------') 19## (訓練セット+検証セット)とを分割する訓練セットと検証セットに分割する 20X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1) 21print(X_train.shape) 22print(X_valid.shape) 23print(y_train.shape) 24print(y_valid.shape) 25 26print('-------------------') 27 28print("Size of training set: {} size of validation set: {} size of test set:" 29 " {}\n".format(X_train.shape[0], X_valid.shape[0], X_test.shape[0])) 30 31 32best_score = 0 33 34for gamma in [0.001, 0.01, 0.1, 1, 10, 100]: 35 for C in [0.001, 0.01, 0.1, 1, 10, 100]: 36 ## それぞれの組み合わせに対してSVCを訓練する 37 svm = SVC(gamma=gamma, C=C) 38 svm.fit(X_train, y_train) 39 ## SVCを”検証セット”で評価する 40 score = svm.score(X_valid, y_valid) 41 ## いいスコアだったらスコアとパラメータを保存 42 if score > best_score: 43 best_score = score 44 best_parameters = {'C':C, 'gamma':gamma} 45 46## 訓練セットと検証セットを用いて改めてモデル作成 47svm = SVC(**best_parameters) 48svm.fit(X_trainval, y_trainval) 49## テストセットを使って評価 50test_score = svm.score(X_test, y_test) 51 52print('Best score on validation set : {:.2f}'.format(best_score)) 53print('Best parameters: ', best_parameters) 54print('Test set score with Best parameters:{:.2f}'.format(test_score))
ただ、その次にscikit-learnのGridSearchCVを利用する方法が喜寿されていたのですが、そのコードには交差検証はされているのですが訓練セットを検証セットに分ける方法は記述されておらず、「訓練セットと検証セットを分割する代わりに交差検証を行う」とありました
個人的には「訓練セットと検証セットを分割する代わりに交差検証を行う」という部分が、データを分割することと交差検証は別の話じゃないのかなと引っかかっています
GridSearchCVは自動的に訓練セットと検証セットを分けたうえでモデルを作成しているのでしょうか?
またデータセットを分割する方法は訓練セットとテストセットに分けるだけなのか、検証セットも作ってモデルを作るのはどちらで行うべきなのでしょうか?
的外れな質問かもしれませんがアドバイス宜しくお願い致します
以下、scikit-learnのGridSearchCVを利用する方法
python
1X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0) 2 3X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1) 4 5 6param_grid = {'C':[0.001, 0.01, 0.1, 1, 10, 100], 7 'gamma':[0.001, 0.01, 0.1, 1, 10, 100]} 8print('Parameter grid:\n{}'.format(param_grid)) 9 10grid_search = GridSearchCV(SVC(), param_grid, cv=5) 11 12X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0) 13 14grid_search.fit(X_train, y_train) 15 16print('Test set score : {:.2f}'.format(grid_search.score(X_test, y_test)))
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/23 05:29
2018/07/23 08:38 編集
2018/07/23 08:40
2018/07/23 14:27
2018/07/23 23:12
2018/07/24 02:18
2018/07/24 08:42
2018/07/29 14:15