简介:这是一份机器学习原理及应用练习题答案文档,面向机器学习学习者与备考学生,内容聚焦算法原理与实践应用。文档按章节整理了机器学习概述、逻辑回归与最大熵模型、k-近邻算法、决策树、朴素贝叶斯分类器、支持向量机、随机森林以及深度学习等核心主题,每章均设有选择题和参考答案,并配有简答题要点,能帮助读者快速检验概念理解;其中对过拟合、正则化、SVM核函数、随机森林集成策略等易混淆知识点也有针对性解析。资源共 1 个 docx 文件,大小约 31KB,轻巧便携,适合随时翻阅复习。目前已有 2226 人学习下载。无论是期末复习、考研准备还是入门自测,都能借助这份答案查漏补缺,尤其适合需要系统梳理机器学习基础概念、常见算法及模型选择方法的初学者。
1. 「机器学习原理及应用练习题答案.docx」が問いかけているもの
このファイル名のdocxには、コースの中で問われやすい「原理」と「応用」の演習問題と、それに対する解答がまとめられている。具体的には、正則化や損失関数の意味を説明する概念問題、小さなデータセットでエントロピーや事後確率を計算する問題、線形回帰のパラメータを求める計算問題という構成が典型的だ。期末試験前に一気に復習したい学生はもちろん、実務で「予測はできるが理論の説明が苦手」という壁に当たったエンジニアにとっても、ちょうどよい問題集になる。ただし、答えを丸暗記しても数字や設定が変われば手が止まる。この記事では、練習問題を自分の力で解いて解答資料を作る流れに沿って、理論の要点、具体的な計算手順、docxへの整理方法、答案の検証テクニックを順に書いていく。
2. 机器学习原理的概念问题:正則化・損失関数・評価指標の答え方
2.1 「説明せよ」問題の答案は4要素で組み立てる
概念問題の採点者は、結論だけを見ているわけではない。ある概念を定義し、その理由を一言添え、数字や具体例で補強し、最後に適用上の注意を書く。この4点セットを答案の型にしておくと、どのような問いにも応用が効く。たとえば「L2正則化とは何か」という問題に対しては、「重みの二乗和を損失関数に加え、モデルの複雑さにペナルティを課すこと」と定義し、「重みが大きくなると損失が膨らむため、過学習が抑えられる」と理由を書く。その上で「Ridge回帰が代表例で、正則化係数λを0.1から10に上げると、パラメータの絶対値は小さくなる」という具体例を添える。
この型を意識すると、「機械学習モデルを自分で書けるか」と聞かれたときに、単に「書ける」と答えるのではなく、「損失関数の最小化として最急降下法を実装すれば、基礎的なモデルは書ける」と論理的に答えられる。演習問題にも「过拟合とは何か」「L1正則化がスパース解を生むのはなぜか」といった出題が多いが、いずれも定義、理由、例、注意の4点で回答を埋められる。
def f1_from_confusion(tp, fp, tn, fn): precision = tp / (tp + fp) recall = tp / (tp + fn) f1 = 2 * precision * recall / (precision + recall) return precision, recall, f1 tp, fp, tn, fn = 15, 25, 55, 5 precision, recall, f1 = f1_from_confusion(tp, fp, tn, fn) print(f"precision={precision}, recall={recall}, f1={f1}") # precision=0.375, recall=0.75, f1=0.5このコードは混同行列から適合率・再現率・F1を求めるもので、評価指標の問題が出たときに機械的に計算できる。引数のtpとfpを逆にするとprecisionとrecallが入れ替わり、結果が大きく変わる。答案に書くときは「tpは実際に陽性で、予測も陽性だった数」という定義を先に明記し、混同行列の表から各値を漏れなく読み取ること。
2.2 過学習対策の比較表で答えの抜けを防ぐ
過学習への対策は、単語だけ列挙するのではなく「どの仕組みで」「どの効果があり」「どのような副作用があるか」まで含めて書く必要がある。この比較表を自分で用意しておけば、記述問題で項目の抜けがなくなる。
| 対策 | 仕組み | 効果 | 注意点 |
|---|---|---|---|
| L2正則化 | 重みの二乗和を損失に加える | 重みの値を均等に小さくする | 特徴量を完全に0にはしない |
| L1正則化 | 重みの絶対値を損失に加える | 一部の重みを0にする | λの調整が難しい |
| 交差検証 | データを分割して評価を繰り返す | 汎化性能を正確に見積もる | 分割数が小さいと分散が大きい |
| Dropout | ニューラルネットのノードを確率的に無効化 | 特定ノードへの依存を防ぐ | 推論時は無効化しない |
| データ拡張 | 学習データを変形して増やす | 入力の多様性を増し、過学習を抑える | 適用できるデータの種類が限られる |
この表を答案にそのまま載せる必要はない。比較表を作っておくと「L2正則化の副作用は何か」という形で応用問題に切り替わっても怖くない。さらに「损失函数 の設計がモデルの性能を左右する理由」を説明する記述では、経験リスク最小化と構造リスク最小化の違いに触れると得点の幅が広がる。結構込み入った話になるため、この章でしっかりコードと表を組み合わせて理解しておくと後で効く。
3. 机器学习计算问题の解き方:情報利得・ナイーブベイズ・最小二乗
3.1 情報利得を天気データで手計算する
決定木のID3アルゴリズムで頻出なのが、情報利得の計算だ。天気のデータセットを例にして、属性「天気」で分割する前後でエントロピーがどれだけ減るかを求める。問題文に14個のサンプルがあり、そのうち再生が9個、不再生が5個、天気の内訳が晴れ5個・曇り4個・雨5個という設定がよく使われる。
| 天気 | 再生 | 不再生 | 合計 |
|---|---|---|---|
| 晴れ | 3 | 2 | 5 |
| 曇り | 4 | 0 | 4 |
| 雨 | 2 | 3 | 5 |
| 合計 | 9 | 5 | 14 |
この表から情報利得を計算するコードは次のようになる。
import numpy as np def entropy(x): x = np.array(x, dtype=float) s = x / x.sum() return -np.sum(s * np.log2(s + 1e-15)) base = entropy([9, 5]) # 分割前のエントロピー 0.9391 sunny = entropy([3, 2]) # 0.9710 overcast = entropy([4, 0]) # 0.0 rainy = entropy([2, 3]) # 0.9710 weighted = 5/14 * sunny + 4/14 * overcast + 5/14 * rainy gain = base - weighted print(f"base={base:.4f}, weighted={weighted:.4f}, gain={gain:.4f}") # base=0.9391, weighted=0.6935, gain=0.2456この計算で重要なのは、加重平均の重みに「各属性値のサンプル数 ÷ 全体のサンプル数」を使う点だ。曇りのエントロピーは0になるが、サンプル数が4なので全体に与える影響は限られる。情報利得が大きい属性ほど、分割後の不純度が小さくなる。決定木の選択問題では、この値を複数の属性で比較して最大のものを選べばよい。+ 1e-15はlog(0)がマイナス無限大になるのを防ぐための微小値で、答案を書くときは「確率0の項は0として扱う」と注記しておくと採点者に伝わりやすい。
3.2 ナイーブベイズで事後確率の正規化を確認する
ベイズ分類の問題では、事前確率と尤度から事後確率を求め、最後に全体の和が1になるように正規化する。問いでよく見落とされるのが、分子を計算して終わりにしてしまうケースだ。リンゴとバナナの分類を例にすると、リンゴが4個、バナナが3個、特徴は「赤い」「丸い」の2つとする。リンゴのうち赤いものが3個、丸いものが4個、バナナのうち赤いものが1個、丸いものが1個という条件をコードで計算する。
prior_apple = 4 / 7 prior_banana = 3 / 7 p_red_apple = 3 / 4 p_round_apple = 4 / 4 p_red_banana = 1 / 3 p_round_banana = 1 / 3 score_apple = prior_apple * p_red_apple * p_round_apple score_banana = prior_banana * p_red_banana * p_round_banana total = score_apple + score_banana post_apple = score_apple / total post_banana = score_banana / total print(f"apple={post_apple:.4f}, banana={post_banana:.4f}") # apple=0.9000, banana=0.1000特徴が独立であるという仮定のもとで、各特徴の条件付き確率をかけ合わせるのがナイーブベイズの計算だ。ここでscore_appleとscore_bananaを比べるだけで終えるのではなく、確率の総和が1になることを確認する癖をつける。また、もしバナナに「丸い」ものが1つもなかった場合、p_round_bananaが0になりscore_bananaが0となってしまう。このゼロ頻度問題にはラプラス平滑化を適用する、という記述まで書ければ応用問題にも対応できる。
3.3 線形回帰を最小二乗法で解く
線形回帰の計算問題は、行列の形で解くことが多い。データ点 (1,2), (2,3), (3,5) に対して y = ax + b のパラメータを求めよ、という問題なら、計画行列Xを作り(X^T X)^(-1) X^T yを計算する。
import numpy as np X = np.c_[np.ones(3), [1, 2, 3]] y = np.array([2, 3, 5]) w, residuals, rank, _ = np.linalg.lstsq(X, y, rcond=None) print(w) # [0.333..., 1.5]np.c_で切片用の1の列と説明変数の列を結合している。w[0]が切片b、w[1]が傾きaになるため、この問題の答えは y = 1.5x + 1/3 だ。行列で解くときの確認方法として、手計算で(X^T X)と(X^T y)を求め、逆行列をかけた結果が一致するかを見るとよい。pythonのコードだけに頼ると、行列の掛け算順序を誤解したまま答えを出す危険がある。答案には「Xは (3,2) 行列、, yは (3,) ベクトル。(X^T X)は (2,2) になる」という次元の記述を添えると採点者に丁寧な印象を与えられる。
4. 答案docxをpython-docxで組み立てる:数式・図・表の配置
4.1 答案docxに含めるべき4つの要素
学習の記録として残す場合も、提出用の答案を作る場合も、docxの各問題には「問題文の再掲」「解答の仮定」「計算プロセス」「最終結果」の4つを対応付ける。特に仮定の明示は重要で、ベイズ分類であれば「特徴は独立と仮定する」、線形回帰であれば「誤差項の分散は均一と仮定する」と書くだけで論理の飛躍がなくなる。計算プロセスは式を羅列するのではなく、どのような順序で数を当てはめたかを短い注釈で示す。
4.2 python-docxで見出し・図・表を持つ文書を生成する
python-docxを使えば、Markdownのように簡単にWord文書を生成できる。最小二乗の計算結果を図と表でまとめた答案docxは次のような流れで作る。
from docx import Document from docx.shared import Inches import matplotlib.pyplot as plt import numpy as np x = np.array([1, 2, 3]) y = np.array([2, 3, 5]) xs = np.linspace(0, 4, 100) plt.plot(x, y, 'o', label='data') plt.plot(xs, 1.5 * xs + 1/3, '-', label='fit') plt.legend() plt.savefig('regression.png', dpi=150) doc = Document() doc.add_heading('机器学习原理及应用 练习题答案', 0) doc.add_heading('第3题 线性回归系数', level=1) p = doc.add_paragraph() p.add_run('解:').bold = True p.add_run('假设模型为 y = ax + b,用最小二乘估计参数。') doc.add_picture('regression.png', width=Inches(4.5)) table = doc.add_table(rows=3, cols=2) table.style = 'Light Grid Accent 1' cells = [('b', '1/3'), ('a', '1.5')] for i, (name, value) in enumerate(cells, start=1): table.rows[i].cells[0].text = name table.rows[i].cells[1].text = value doc.save('answers.docx')add_headingの第2引数は見出しレベルで、0を指定すると文書タイトル扱いになる。add_pictureは直前の段落の後ろに画像を挿入するため、計算説明の後に配置したい場合は、図を挿入する前に説明用の段落を追加しておく。表はadd_tableで作るが、styleを設定しておかないと罫線のない表になりWord上で見づらくなる。Wordのバージョンによって使えるスタイル名が異なるため、実行後にtable.styleがエラーになる場合は標準の'Table Grid'に変更するとよい。
4.3 数式はWordの数式エディタとPandocのどちらかで統一する
python-docxは段落や表の操作に強いが、数式の挿入はやや面倒だ。数式が少ない答案なら、Wordを開いてAltを押した後に=と打鍵して数式エディタを起動し、そのまま直接入力するのが最も確実である。数式が多い場合は、Markdownで本文を書いてPandocで変換する方法が使いやすい。
pandoc answers.md -o answers.docxこのコマンドは、Markdown内の$y = ax + b$という数式をWordのネイティブな数式オブジェクトに変換する。答案全体を一度にdocx化でき、途中の.docxが壊れてもanswers.mdが残っていれば再生成できる。Pandocを使う場合は、画像ファイルがMarkdownと同じディレクトリにないと変換後のdocxに画像が埋め込まれない点に注意する。
5. 答案の検証:極端値・混同行列・対数底の典型ミスを潰す
5.1 計算ミスを発見する5つのチェック項目
手計算やPythonのスクリプトで得た答えをそのまま提出する前に、次のチェックリストで検証する。特に個人で学習しているときは、正解を誰にも確認してもらえないため、この工程が最大の採点者になる。
| チェック対象 | よくあるミス | 検証方法 |
|---|---|---|
| 対数の底 | log10でエントロピーを計算 | np.log2を使い、結果が0〜1に収まるか確認 |
| 確率の総和 | 事後確率を合計すると1にならない | 正規化の分母を明示する |
| 混同行列の配置 | tpとfpを取り違える | tpは実際陽性かつ予測陽性、fpは実際陰性かつ予測陽性と表に書く |
| 行列の次元 | Xとyの掛け算の順序を誤る | Xの列数とyの要素数が一致するか確認 |
| 極端値 | 全サンプルが同じクラスでエントロピーが0になる | entropy([1, 0]) を実行してみる |
5.2 エントロピー関数の境界値を確認する
情報利得の計算で使ったエントロピー関数が正しく実装されているかを試すには、境界値を入れてみるのが手軽だ。全サンプルが同一クラスならエントロピーは0、2クラスが半数ずつなら1になる。
e0 = entropy([1, 0]) e1 = entropy([1, 1]) print(e0, e1) # 0.0 1.0この2つが少しでもずれるなら、対数の底やnp.sumの分母の取り方が間違っている可能性が高い。情報利得はこのエントロピーの差で計算するため、ここを信頼できないと決定木の問題すべてが不安定になる。実際の演習問題では、検証のために、コード上でエントロピー関数を「確率の合計で割る」仕様に統一しておくのが安全だ。この極端値チェックは数式を答案に写し間違えているときにも有効で、手書きで求めた値とコードの出力が一致するかを確かめる最初の一歩として試してほしい。
本文还有配套的精品资源,点击获取