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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1785閲覧

NameError: name 'y_test' is not definedとなり,変数が定義されてない理由

kouji_39

総合スコア164

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/05/06 14:53

1.前提・実現したいこと
NameError: name 'y_test' is not definedとなり,変数が定義されてない理由が知りたい。

2.発生している問題・エラーメッセージ
NameError Traceback (most recent call last)
<ipython-input-3-81806d1e191e> in <module>()
1 if name == 'main':
2 main()
----> 3 y_test

NameError: name 'y_test' is not defined

3.該当のソースコード

python3

1import xgboost as xgb 2 3import numpy as np 4from sklearn import datasets 5from sklearn.model_selection import train_test_split 6from sklearn.metrics import accuracy_score 7 8"""XGBoost で二値分類するサンプルコード""" 9 10def main(): 11 # 乳がんデータセットを読み込む 12 dataset = datasets.load_breast_cancer() 13 X, y = dataset.data, dataset.target 14 # データセットを学習用と検証用に分割する 15 X_train, X_test, y_train, y_test = train_test_split(X, y, 16 test_size=0.3, 17 shuffle=True, 18 random_state=42, 19 stratify=y) 20 # XGBoost が扱うデータセットの形式に直す 21 dtrain = xgb.DMatrix(X_train, label=y_train) 22 dtest = xgb.DMatrix(X_test, label=y_test) 23 # 学習用のパラメータ 24 xgb_params = { 25 # 二値分類問題 26 'objective': 'binary:logistic', 27 # 評価指標 28 'eval_metric': 'logloss', 29 } 30 # モデルを学習する 31 bst = xgb.train(xgb_params, 32 dtrain, 33 num_boost_round=100, # 学習ラウンド数は適当 34 ) 35 # 検証用データが各クラスに分類される確率を計算する 36 y_pred_proba = bst.predict(dtest) 37 # しきい値 0.5 で 0, 1 に丸める 38 y_pred = np.where(y_pred_proba > 0.5, 1, 0) 39 # 精度 (Accuracy) を検証する 40 acc = accuracy_score(y_test, y_pred) 41 print('Accuracy:', acc) 42 43 44if __name__ == '__main__': 45 main() 46#y_testの値を確認 47y_test###ここまでで、コード実行してエラー発生## 48 49 50#提出用ファイル作成 51import pandas as pd 52import csv, os, time 53df = pd.DataFrame({'y_test':y_test,'y_pred':y_pred}) 54 55#pandas.DataFrameは二次元の表形式のデータ(テーブルデータ)を表す、pandasの基本的な型。 56print(df) 57#ファイルの書き出し 58filename ='test.csv' 59df.to_csv(filename,index=False) 60!ls 61!cp "./{filename}" ./drive/MyDrive/

4.自分で調べたことや試したこと
name 'y_test' is not definedについて、ネット検索した。
つまり、「y_testが定義されていない」ということであるが、
データセットを学習用と検証用に分割したコードで、y_test
が定義されていると思います。ちなみに、main()が実施されて、分割コード
が実施され、その下に「print(y_test)」については表記されています。

5.使っているツールのバージョンなど補足情報
開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz

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

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

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

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

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

meg_

2022/05/06 15:28

インデントは質問のコードで合ってますか?
meg_

2022/05/06 16:22 編集

そもそも質問のコードは「#y_testの値を確認」のところでSyntaxErrorになるので質問の状態は再現できませんでした。実際に実行したコードに差し替えてもらえないでしょうか?
guest

回答1

0

ベストアンサー

y_testは、main関数の中でしか定義されておらず、mainの外では未定義です。

このあたりのことがわかるまでは、関数を使うのをやめましょう。
def main():と、if __name__ == '__main__':main()の3行を削除して、あとはインデントを整えます。

投稿2022/05/06 18:38

otn

総合スコア84538

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

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

kouji_39

2022/05/06 21:36 編集

エラーが無くなりました。 「y_testは、main関数の中でしか定義されておらず、mainの外では未定義」の意味は、https://pasopet.com/python_global_variable (関数内の変数の操作は関数内でのみ有効)で理解できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問