第2回 Python 3 エンジニア認定データ分析 模擬試験 第2回 Python 3 データ分析 模擬試験 へようこそ。 以下の各項目を入力後、「次へ」をクリックして模擬試験を開始してください。 ※あらかじめ利用規約をご確認ください(プライム・ストラテジーから採用やイベントの情報など届くことがあります)。 ※結果の詳細は入力いただいたメールアドレス宛てにのみお送りします。必ず確認可能なメールアドレスを入力してください。 お名前 メールアドレス(結果の詳細をお送りします) 利用規約に同意する。 1. 機械学習に関する次の記述のうち、正しいものはどれか。 教師あり学習は、正解となるラベルデータが存在する場合に用いられる方式であり、そのラベルを説明変数という。 教師あり学習は、目的変数の種類により回帰と分類の2種類に分けられる。このうち分類は目的変数が連続値となる。 教師なし学習の1つであるDBSCAN法は密度準拠クラスタリングアルゴリズムであり、特徴量ベクトル間の距離に着眼した手法である。 教師なし学習は、正解ラベルを用いない学習方法であり、クラスタリングや次元削減といったタスクを行う。典型的なものにニューラルネットワークを用いた深層学習がある。 強化学習は、ブラックボックス的な環境の中で行動するエージェントが、得られる報酬を最大化するように学習する方法であり、ルールベースと比較される機械学習の伝統的な手法である。 2. データ分析に関する次の記述のうち、正しいものはどれか。 データサイエンティストの役割は、研究分野と実務で多少の違いがある。研究分野においては解決したい課題に向き合う部分が重視され、実務においては新たな解法や新技術への取り組みが重視される。 データ分析エンジニアが持つべき技術として、データの入手や加工などのハンドリング、データの可視化、プログラミングなどがある。これらのうちデータの入手や加工などのハンドリングには、主にMatplotlibが使われる。 データ分析に利用されるプログラミング言語には、Python、R、Julia、HTML、Excel Visual Basic for Applicationsなどがある。 Pythonでデータ分析に使われる主なパッケージには、Jupyter Notebook、NumPy、pandas、Matplotlib、Scipy、scikit-learnなどがある。 Pythonはデータ分析以外の分野でも活用されており、Webアプリなどのフロントエンド、速度向上のための低レイヤー処理などの分野においても他のプログラミング言語に比して優位性が高い。 3. PythonおよびPythonの実行環境に関する次の記述のうち、正しいものはどれか。 venvはPythonの仮想環境を作成する仕組みである。WindowsでもmacOSでも利用することができ、異なるバージョンのPython言語を使い分けるのに便利である。 Anacondaで設定した環境下では、パッケージの管理にはAnaconda独自のcondaコマンドだけが利用可能である。 PythonにはPEP 8と呼ばれる標準となるコーディング規約が存在する。たとえば複数のモジュールをインポートするときには、まとめてimportして書くべきとされている。 作成したプログラムがPEP 8に違反していないかチェックするツールとしてFlake8がある。定義したが使用していない変数も併せてチェックするツールとしてpycodestyleがある。 pipコマンドは、The Python Package Index に公開されているPythonパッケージのインストールなどを行うユーティリティである。パッケージをインストールするにはpip installコマンドを使用する。 4. 次のスクリプトの2行目以降を代替できるリスト内包表記として正しいものはどれか。 colors = ['red', 'blue', 'yellow'] lens =[] for color in colors: lens.append(len(color)) lens {len(color) for color in colors} [len(colors) for colors in color] [lens(color) in color for colors] {lens(colors) in color for color} [len(color) for color in colors] 5. 次の正規表現を用いたスクリプトの[ ア ]の部分に入れたときエラーとなるものはどれか。 import reprog = re.compile('Kus(a|u)n(a|o)(k|g)i(saya)?', re.IGNORECASE) [ ア ] print(ret[0]) ret = prog.search('KUSANAGI') ret = prog.search('Kusanagi saya') ret = prog.search('KUSUNOKI') ret = prog.search('KUSANOgi') ret = prog.search('Kusanoao') 6. モジュールに関する次の記述のうち誤っているものはどれか。 pickleモジュールは、Pythonのオブジェクトを直列化してファイルなどで読み書きできるようにすることができる。pickle化できるものとしてブール値や数値、文字列などがある。 日付などの処理にはdatetimeモジュールが便利である。たとえば、nowメソッドでは現在日時を取得することができる。 Pythonでファイルのパスを扱うにはpathlibモジュールが便利である。globメソッドではファイル名をワイルドカード(*)で指定することもできる。 loggingモジュールはログレベルを指定して任意のファイルにフォーマットを指定してログの出力を行うことができ、たとえば、バッチ処理などの途中経過を出力する用途に用いる。 loggingモジュールのログレベルには、重要度の高い順にCRITICAL、ERROR、WARNING、DEBUG、INFOの5種類がある。 7. Jupyter Notebookに関する次の記述のうち正しいものはどれか。 Jupyter Notebookではセル単位で処理を実行できるため、変数の内容が意図しないものとなることがある。そこで変数の後ろに「%」をつけて実行することで当該セルでの変数の値を確認できる。 Notebookファイルは保存することができ、その拡張子は「.json」である。 Jupyter Notebookはオープンソースで開発されているデータ分析、可視化、機械学習などに広く利用されるWebアプリケーションである。 マジックコマンドは、「!」または「!!」からはじまる特別なコマンドで、たとえば、プログラムの実行時間を複数回試行して計測を行うコマンドもある。 NotebookファイルはYAML形式で記述されており、プログラムや結果を参照するためには基本的にはJupyter Notebookを実行する必要があるが、yumなどのリポジトリサービスはNotebookファイルの表示に対応しているため、これらを利用して参照することができる。 8. 数学の基礎に関する次の記述のうち誤っているものはどれか。 指数関数を応用した関数にシグモイド関数がある。シグモイド関数は、深層学習の基本的な技術であるニューラルネットワークでよく使われる。 シグモイド関数のグラフの形は、座標点(0, 0.5)を基点として点対象の、S字型曲線である。 数式で足し算の繰り返しを表す際には、ギリシャ文字のシグマの大文字を用い、プログラムではそのままは実行できない「無限大まで足し算を繰り返す」という動作も表現できる。 ネイピア数とは数学定数の一つで、常用対数の底であり、通常「e」の記号で表現される。対数関数で底が省略された場合には、「e」なのか「10」なのかは注意が必要である。 三角関数では、角度の大きさを表す単位として度数法のほかに弧度法が使われる。 9. (3, 4) で表現されるベクトルをAとする。(4, 7)で表現されるベクトルをBとする。(2, 4, 5) で表現されるベクトルをCとする。次のベクトルに関する記述のうち正しいものはどれか。 Aの原点からのユークリッド距離は25である。 Bの原点からのマンハッタン距離は11である。 AとBの内積は36である。 AとCの和は18である。 AとCの差は52である。 10. 行列に関する次の記述のうち誤っているものはどれか。 行と列のサイズが同じ行列を特に正方行列と呼ぶ。正方行列のうち、対角成分がすべて1で、残りの要素が0の行列を単位行列と呼ぶ。 ベクトルと同じように要素同士の足し算と引き算で、行列の足し算と引き算を定義することができるが、2つの行列の行数と列数が合っている必要がある。 行列の列の数とベクトルのサイズが同じ場合は、これらの掛け算を定義することができ、結果は、元の行列の行数と同じサイズのベクトルになる。 行列同士の掛け算は行列となる。数値の掛け算は順番を入れ替えても同じ結果となるが、行列の掛け算は順番を入れ替えると同じ結果になることはない。 行列の分解の理論「m×sの行列にs×nの行列を賭けると、m×nの行列になる」を逆に考えると、データ分析や機械学習において、説明変数の次元数を削減することができる。 11. 微分積分に関する以下の記述のうち誤っているものはどれか。 関数 F(x)を微分して f(x)となったとき、F を f の原始関数、f を F の導関数と呼ぶ。 積分の範囲が定められていない積分を不定積分という。任意の定数を微分すると0になるため、不定積分には積分定数「C」が通常含まれる。 微分は傾き、積分は面積と捉えることができる。データ分析や機械学習において、関数の傾きが0となる点は有益な情報として利用される。 2つ以上の変数を持つ多変数関数の微分を偏微分という。偏微分ではどの変数で微分したのかを示すことが必要である。 右辺が5x^2(5掛けるxの2乗)で表現される関数 f(x)を積分すると、右辺は15x^3+C(Cは積分定数)となる。 12. 確率と統計に関する次の記述のうち、正しいものはどれか。 標準偏差は、すべてのデータの平均値からの差分を二乗して合計しデータの個数で割った値である。 6面体のサイコロを1回振った場合、その出目の数自体は不明なものの、奇数がでていることを教えられたとする。この場合の確率を条件付き確率と呼び、これはベイズの定理の基本となっている。 12面体のサイコロを1回振った場合の期待値は6である。 10段階評価のアンケートの回答で、もっとも回答者数が多かった評価が5であった場合、アンケートの中央値は5である。 確率変数を引数にとって値を返す関数のうち、確率変数が離散的な場合を確率密度関数、確率変数が連続的な場合を確率質量関数という。標準正規分布などの確率分布は確率質量関数から得ることができる。 13. 「1の対数、ネイピア数、sin(30°)、円周率、0の階乗」の5つの数からなるデータがある。このデータについて正しいものはどれか。 最頻値は1である sin(30°)は中央値より大きい 算術平均は中央値より小さい ネイピア数は円周率より大きい 0の階乗は1の対数より大きい 14. NumPyに関する次の記述のうち、誤っているものはどれか。 NumPyオブジェクトの型を確認するためにはtype関数を、NumPy配列の要素のデータ型を確認するにはdtype属性を用いることができる。 NumPy配列の形状を変形するためにはreshapeメソッドを、NumPy配列の要素のデータ型を変換するためにはastypeメソッドを用いることができる。 2次元のNumPy配列を1次元に変換するにはravelメソッドまたはflattenメソッドを用いることができる。ravelメソッドは参照を返し、flattenメソッドはコピーを返す。 Numpy配列ではPython標準のリストと同様、要素を取り出すためにインデックスとスライスを使うことができる。 NumPyは配列や行列を効率よく扱うためのPythonのサードパーティ製パッケージで、行列用の型であるndarrayと配列用の型であるmatrixがある。 15. 次のスクリプトを実行した結果として正しいものはどれか。 import numpy as np a = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([7,8,9])print(a[-1:, [1,2]], b.shape) [[1 2], [4 5]] (1,3) [[1 2], [4 5]] (3) [[1 2], [4 5]] (3,) [[5 6]] (1,3) [[5 6]] (3,) 16. 次のスクリプトを実行した結果として正しいものはどれか。 import numpy as np a = np.arange(1, 10, 2) b = np.eye(6) print(a[-1], b[3, 3]) 7 1.0 10 1.0 7 3.0 9 1.0 10 0.0 17. 次のスクリプトを実行した結果として正しいものはどれか。 import numpy as npa = np.full((2, 3), np.pi).T.ravel()b = np.linspace(0, 1, 5)c = np.hstack([a, b])print(a[-1], c[-2]) 2.718281828459045 1.0 2.718281828459045 0.75 3.141592653589793 1.0 3.141592653589793 0.75 3.141592653589793 5.0 18. 次のスクリプトを実行した結果として正しいものはどれか。 import numpy as npa = np.array([0, 9, 99, 999])a = a + 1a = a * 10b = np.log10(a)print(a[2], b[1]) 10 1.0 100 1.0 1000 2.0 100 3.0 10000 3.0 19. 次のスクリプトを実行した結果として正しいものはどれか。 import numpy as np a = np.array([1, 4]) b = np.array([-1, 6]) c = np.array([[1, 2], [3, 4]]) d = a @ b e = np.dot(c, a) print(d, e) 24 [ 11 21 ] 23 [ 9 19 ] 11 [ 8 18 ] 12 [ 9 19 ] 20. 次のスクリプトを実行して20を出力させたい。[ア]に入るものの説明として正しいものはどれか。import pandas as pddf = pd.DataFrame([[15, "a", True],[20, "b", False],[10, "c", False]])df.index = ["01", "02", "03"]df.columns = ["A", "B", "C"][ア]print(a) a = df.iloc["A", "02"] または a = df.loc[1, 0] a = df.iloc["A", "02"] または a = df.loc[1, 1] a = df.loc["02", "A"] または a = df.iloc[1, 0] a = df.loc["02", "A"] または a = df.iloc[1, 1] a = df["A", "02"] 21. pandasのデータの読み込みと書き込みに関する次の記述のうち誤っているものはどれか。 CSVファイルからのデータの読み込みは、read_csvメソッドを、CSVファイルへのデータの書き込みはto_csvメソッドを用いることができる。 Execlファイルからのデータの読み込みは、read_excelメソッドを、Excelファイルへのデータの書き込みはto_excelメソッドを用いることができる。 read_htmlメソッドを使うと、WebサイトのHTML内のtable要素を、直接DataFrameに取り込むことができる。table要素が複数ある場合には、最初の要素のみが取得される。 DataFrameを直列化してファイルとして保存し、再利用するためにpickleモジュールを利用することができる。 pandasのデータの読み込みと書き込みの関数はほかにも to_sql やto_jsonなどさまざまなものがある。ただしpandasのバージョンによっても異なる。 22. 次のスクリプトを実行した結果として正しいものはどれか。 import pandas as pd df = pd.DataFrame([[40, "a", True],[20, "b", False],[30, "c", False]]) df.index = ["01", "02", "03"] df.columns = ["A", "B", "C"] def judge(arg): if arg < 50: return "low" elif arg < 70: return "middle" else: return "high" df.loc[:, "C"] = df.iloc[:, 0] * 2 df.loc[:, "B"] = df.iloc[:, 2].apply(judge) _ = df["C"] > 50 df = df[_] print(df.iloc[0 , 2], df.loc["03" ,"B"]) 20 middle 30 middle 80 middle 30 high 40 high 23. 次のスクリプトに関する説明のうち誤っているものはどれか。 import numpy as np import pandas as pd np.random.seed(123) dates = pd.date_range(start="2017-04-01", periods=365) df = pd.DataFrame(np.random.randint(1, 31, 365), index=dates, columns=["rand"]) df_year = pd.DataFrame(df.groupby(pd.Grouper(freq='W-SAT')).sum(), columns=["rand"] ) 3行目でシード値「123」を「321」に入れ替えると、「123」のときとは異なる値が出力されるものの、複数回スクリプトを実行しても結果は同じとなる。 4行目は、2017年4月1日から365日分の日付の配列を生成する処理である。periods=365 を end="2018-03-31" としても同じ結果となる。 5行目は、日付をインデックスとするDataFrameを作成している。dfを出力するとrand列の各値は、1から31までのランダムな整数となる。 6行目は土曜日の日付をインデックスとするDataFrameを生成する処理である。sum()をmean()に入れ替えてdf_yearを出力すると、rand列の各値は日曜日から土曜日までのrand列の値を平均したものとなる。 6行目の freq="W=SAT" を freq="Y" に変更すると、日付「2017-12-31」「2018-12-31」をインデックスとする2行のDaraFrameが生成される。 24. DataFrameの欠損値の処理に関する次の記述のうち、誤っているものはどれか。 DataFrameの各要素が欠損値かどうかを確かめるメソッドは、isnullである。 欠損値が存在する行や列を削除するメソッドは、dropnaである。 fillnaメソッドの引数にmethod='ffill'を与えると、欠損値を1つ前方の値で補完する。 mean()メソッドの結果をfillnaメソッドに引数として渡すと、欠損値を他の値の平均値で補完できる。 mode().iloc[1.:]の結果をfillnaメソッドに引数として渡すと、欠損値を最頻値で補完できる。 25. DataFrameの基本統計量に関する次の記述のうち、誤っているものはどれか。 stdメソッドは標本標準偏差を取得できる。 countメソッドは件数を取得できる。 modeメソッドは最頻値を取得できる。 medianメソッドは中央値を取得できる。 describeメソッドは期待値を取得できる。 26. pandasに関する次の記述のうち、正しいものはどれか。 相関係数はcorr関数で出力でき、その値は必ず-1から1の間となる。1に近いほど強い正の相関関係があり、-1に近いほど強い負の相関関係があり、0では相関関係がないといえる。 DataFrameをNumPy配列に変換するには、values属性を利用する。この場合、カラム名は保持されないがインデックス名は保持される。 concat関数は、2つのDataFrameを連結する。引数にaxis=0を加えると列方向の連結となり、axis=1を加えると行方向の連結となる。 pandasはNumPyを基盤に2次元のDataFrameと、より多次元のSeriesをデータ型として提供している。 summary関数に引数としてDataFrameを渡すとDataFrameの統計量をまとめて出力することができる。 27. Matplotlibに関する次の記述のうち、正しいものはどれか。 「MATLABスタイル」は描画オブジェクトに対してサブプロットを追加して、サブプロットに対しグラフを描画するため、スクリプトが冗長になる。 「オブジェクト指向スタイル」は一つのfigureオブジェクトに対して複数のサブプロットを指定できる。つまり複数のグラフをまとめて表示できるという利点がある。 ヒストグラムはhistメソッドで、散布図はscatterメソッドで、折れ線グラフはplotメソッドで、曲線グラフはcurveメソッドで描画することができる。 サブプロットにはlegendメソッドで凡例を表示することができる。legendメソッドの引数に loc="min" を指定するとデータとの重なりが最小な位置に出力できる。 描画オブジェクトにはset_titleメソッド、サブプロットにはsuptitleメソッドで、それぞれタイトルを指定できる。 28. Matplotlibに関する次の記述のうち、誤っているものはどれか。 グラフに表示する線、背景色、枠線などの要素には色を指定できる。色の指定方法には、文字列での色指定、16進数でのRGB指定などがある。 折れ線グラフやグラフの枠線、区切り線など、さまざまな線にスタイルを適用できる。linewidth引数を指定すると線の幅を変更でき、その際の単位はポイントである。 同じフォントの指定を複数回繰り返す場合、フォントの設定をタプルデータとして作成し、fontdict引数に一度に指定できる。タプルはイミュータブルなため、誤って上書きされることを防ぎやすい。 textメソッドを使用するとグラフに任意のテキストを描画できる。第一、第二引数には描画するテキストの左下のX, Y座標を指定する。また、フォントのスタイルと同様の引数の指定もできる。 Matplotlibで描画するグラフに日本語を表示するには、日本語フォントの設定が必要である。 29. Matplotlibを用いてsin, cosのグラフを描画する次のスクリプトに関する説明のうち正しいものはどれか。 import numpy as np import matplotlib.pyplot as plt x = np.arange(0.0, 15.0, 0.1) y1 = np.sin(x) y2 = np.cos(x) fig, ax = plt.subplots() ax.plot(x, y1, label='sin') ax.plot(x, y2, label='cos') ax.legend() plt.show() plotメソッドは折れ線グラフのほか、上記スクリプトのように個々の値の間隔を大きくすることで疑似的に曲線のグラフも作成できる。 np.sin(x)、np.cos(x)は、それぞれ引数「x」を弧度法のラジアンで処理する。 xの要素数は149である。 このグラフに凡例はない。 上記スクリプトの描画オブジェクトの中に配置されるサブプロットは2つである。 30. 次のスクリプトに関する説明のうち正しいものはどれか。 import matplotlib.pyplot as pltfig, ax = plt.subplots()x = [1, 2, 3]y1 = [10, 2, 3]y2 = [5, 3, 6]labels = ['Setosa', 'Versicolor', 'Virginica']【ア】ax.bar(x, y_total, tick_label=labels, label='y1') …【イ】ax.bar(x, y2, label='y2') …【ウ】ax.legend()plt.show() このコード群はヒストグラムを描画するものである。 【ア】に入るコードは、y_total = [num1 + num2 for num1, num2 in sum(y1, y2)]である。 barメソッドの引数に変数y1は利用されていない。 描画されるグラフには「Setosa」「Versicolor」「Virginica」が凡例として表示される。 【イ】の行と【ウ】の行を入れ替えてもグラフの表示は変化しない。 31. Matplotlibを用いて正規分布に従うランダムな値をヒストグラムで描画する次のコード群に関する説明のうち誤っているものはどれか。import numpy as npimport matplotlib.pyplot as pltnp.random.seed(123)mu = 100sigma = 15x = np.random.normal(mu, sigma, 1000)fig, ax = plt.subplots()n, bins, patches = ax.hist(x, bins=25, orientation='horizontal')for i, num in enumerate(n): print('{:.2f} - {:.2f} {}'.format(bins[i], bins[i + 1], num))plt.show() 変数muは平均値、変数sigmaは標準偏差を意味する。 ヒストグラムは横向きに描画される。 histメソッドのデフォルトのビン数は20であるが、上記スクリプトで出力されるヒストグラムのビンの数は25である。 histメソッドの返り値が格納される「n, bins, patches」のうち「bins」にはビンの境界の値が入っており、その個数は26である。 このスクリプトを実行するとヒストグラムに加えて度数分布表が出力される。 32. Matplotlibを用いて円グラフを描画する次のスクリプトに関する説明のうち誤っているものはどれか。 import matplotlib.pyplot as plt labels = ['spam', 'ham', 'egg'] x = [10, 3, 1] fig, ax = plt.subplots() ax.pie(x, labels=labels, startangle=90, counterclock=False, shadow=True, autopct='%1.2f%%') plt.show() 円グラフには影がある 円グラフには値のパーセント表記がある 円グラフは上から配置される 円グラフは時計回りに配置される 円グラフのアスペクト比は保持される 33. 機械学習の前処理に関する次の記述のうち、正しいものはどれか。 特徴量の正規化とは、たとえば、ある特徴量の値が2桁の数値(数十のオーダ)、別の特徴量の値が4桁の数値(数千のオーダ)のような場合、前者のオーダの特徴量が重視されやすくなるため、尺度を揃える処理をいう。 分散正規化とは、特徴量の平均が1、標準偏差が0となるように特徴量を変換する処理であり、標準化やz変換と呼ばれることもある。 最小最大正規化とは、特徴量の最小値が0、最大値が1を取るように特徴量を正規化する処理であり、scikit-learnでは、preprocessingモジュールのMinMaxScalerクラスを用いて実行することができる。 カテゴリ変数のエンコーディングとは、数値の0を文字のa、1をb、2をcのように数値をカテゴリ変数に変換する処理をいう。 One-hotエンコーディングでは、たとえば、テーブル形式のデータのカテゴリ変数の列について、取り得る値の分だけ列を増やして、各行の該当する値の列のみに0を、それ以外の列には1を入力するように変換する処理をいう。 34. 分類に関する次の記述のうち、正しいものはどれか。 分類モデルを構築するには、まず手元のデータセットを学習データセットとテストデータセットに分割し、テストデータセットを用いて分類モデルを構築する。 学習データセットとテストデータセットの分割は、scikit-learnでは、model_selectionモジュールのstudy_test_divide関数を用いて実行できる。 構築したモデルが持つ未知のデータに対する対応能力を「汎化能力」という。 分類は、与えられたデータをクラスタリングする教師あり学習の典型的なタスクである。 scikit-learnのインターフェースでは、学習はfitメソッド、予測はestimateメソッドを用いて実行できる。 35. 機械学習のアルゴリズムに関する次の記述のうち、正しいものはどれか。 情報利得は子ノードの不純度から親ノードの不純度を差し引いたものとして定義される。 不純度の指標としてはジニ不純度、エントロピー、分類誤差などが用いられる。 サポートベクタマシンは、分類のみに適用できるアルゴリズムである。直線や平面で線形分離できないデータも高次元の空間に写像して線形分離することで分類を行うことを可能にする。 サポートベクタマシンで決定境界を求める際にマージンを最小にする理由は、決定境界がサポートベクタから近くなり、多少のデータが変わっても誤った分類を行う可能性を低くできると期待できるからである。 決定木などで利用される木と呼ばれるデータ構造はノードとそれらを結ぶエッジから構成される。木の最上部にあり親ノードを持たないノードは葉ノードと呼ばれる。 scikit-learnでランダムフォレストを実行するにはensembleモジュールのRandomForestClassifierクラスを使用する。パラメータで決定木の個数を指定することもできる。 36. 次のスクリプトに関する説明のうち誤っているものはどれか。 from sklearn.linear_model import LinearRegression from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split boston = load_boston() X, y = boston.data, boston.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123) lr = LinearRegression() lr.fit(X_train, y_train ) y_pred = lr.predict(X_test) このスクリプトは米国ボストン市郊外の地域別に、人口一人当たりの犯罪件数や住居の部屋数の平均などを含む14個の特徴量と住宅価格を記録したデータセットを用いて線形回帰を行うものである。 5行目のboston.dataには説明変数、boston.targetには目的変数が格納されている。 データセットは学習用が7割、テスト用が3割の比率で分割される。 このスクリプトの最終行では、学習したモデルを用いてテスト用の説明変数から予測される目的変数を取得している。 このスクリプトで行う回帰は住宅価格を特徴量から求める単回帰である。 37. 次元削減に関する次の記述のうち、正しいものはどれか。 主成分分析は、低次元のデータに対して分散が小さくなる方向を探して、元の次元と同じかそれよりも高い次元にデータを変換する手法である。 次元削減は、データが持っている情報をなるべく損ねることなく次元を削減してデータを展開するタスクである。 次元削減の主目的は目的変数の数を減らして計算量を削減することであるが、説明変数の削減を行うことは少ない。これは、モデルの精度を確保するためである。 主成分分析(principal component analysis)は、scikit-learnのdecompositonモジュールのPCAクラスを用いて実行することができる。 2次元のデータに対して主成分分析を行い、新たな2変数に変換した結果、第一主成分と第二主成分がともに重要であると確認できた場合、1次元に次元を削減できる可能性が高い。 38. モデルの評価指標に関する次の記述のうち、誤っているものはどれか。 適合率は、間違えることをできるだけ避けたい場合に重視する指標である。 再現率は、たとえば病院の検診で病気の見逃し・取りこぼしがないようにしたい場合などに重視される、網羅性に関する指標である。 一般的に適合率と再現率はトレードオフの関係にある。 F値は、適合率と再現率の調和平均として定義される。F値は2*適合率*再現率/(適合率+再現率)で計算することができる。 正解率は、正例か負例かを問わず、予測と実績が一致したデータの割合を表す。正解率は(tp+tn)/(tp+fp+fn+tn)で計算することができる。 適合率、再現率、F値、正解率は、機械学習を用いて構築した回帰モデルの良し悪しを評価する指標であり、混同行列から計算する。 39. 次のスクリプトに関する説明のうち誤っているものはどれか。 from sklearn.datasets import load_iris from sklearn.model_selection import GridSearchCV from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123) clf = DecisionTreeClassifier() param_grid = {'max_depth': [3, 4, 5]} cv = GridSearchCV(clf, param_grid=param_grid, cv=10) cv.fit(X_train, y_train) y_pred = cv.predict(X_test) このスクリプトではハイパーパラメータである決定木の深さをグリッドサーチにより求めている。ハイパーパラメータを最適化する代表的な方法としてほかにランダムサーチがある。 このスクリプトで用いられているIrisデータセットには、150枚のアヤメの「がく」や「花びら」の長さと幅、そして花の種類が記録されている。 花の種類は目的変数であり、スクリプトの6行目で変数「y」に格納されている。 このスクリプトでは10分割の交差検証が実行される。 このスクリプトの最終行では学習したモデルを用いてテスト用の説明変数から予測される目的変数を取得している。 このスクリプトを複数回実行した場合、求められる決定木の深さの最適値は必ず同じ値となる。 40. クラスタリングに関する次の記述のうち、正しいものはどれか。 クラスタリングは、ある基準を設定してデータ間の類似性を計算し、データをクラス分類するタスクであり、教師あり学習の典型的なタスクである。 クラスタリングにおいては、得られたクラスタの妥当性に絶対的な答えがある。 凝集型の階層的クラスタリングは、最初にすべてのデータが一つのクラスタに所属していると考え、順次クラスタを分割していく手法である。 k-meansは、最初にランダムにクラスタ中心を割り当て、クラスタ中心を各データとの距離を計算しながら修正し、最終的なクラスタ中心が収束するまで再計算を行いクラスタリングする手法である。 k-meansは、scikit-learnのclusterモジュールのAgglomerativeClusteringクラスを用いることによって実行することができる。 Time's up試験は終了です。「回答を送信」ボタンを押下してください。