1 教師あり学習において、モデルパラメータとハイパーパラメータの違いは何ですか?
教師あり機械学習において、モデルパラメータとは最適化アルゴリズム(勾配降下法や正規方程式など)を通じて訓練データから直接学習される内部変数のことです。具体例としては、線形モデルにおける回帰重みやバイアス、決定木における分岐の閾値などが挙げられます。対照的に、ハイパーパラメータは学習プロセス、モデルの表現力(キャパシティ)、またはアーキテクチャを制御するために訓練前にあらかじめ設定される外部の設定値です。標準的な訓練損失の最小化によって直接学習することはできません。なぜなら、最適化手法が自明に過学習してしまうためです(例:決定木の深さを無限大に設定するなど)。具体例としては、学習率、正則化強度(lambdaやC)、ランダムフォレスト内の決定木の数、決定木の最大深度などがあります。ハイパーパラメータは検証データまたは交差検証(クロスバリデーション)を用いて調整されます。
from sklearn.linear_model import Ridge
import numpy as np
X = np.array([[1.0], [2.0], [3.0]])
y = np.array([2.0, 4.0, 6.0])
# Hyperparameter: alpha (regularization strength set beforehand)
model = Ridge(alpha=1.0)
# Fitting optimizes internal parameters on training data
model.fit(X, y)
# Learned parameters
print(f"Weight (Parameter): {model.coef_[0]:.4f}")
print(f"Intercept (Parameter): {model.intercept_:.4f}")
AI コーチを使ってこの質問に答えてみる
2 通常の最小二乗法(OLS: Ordinary Least Squares)線形回帰ではどのような前提条件(仮定)が置かれていますか。また、残差診断によってそれらの仮定の違反はどのように明らかになりますか。
通常の最小二乗法(OLS: Ordinary Least Squares)線形回帰は、いくつかの重要な仮定に基づいています。
1. 線形性: 説明変数と目的変数の関係がパラメータに対して線形であること。
2. 誤差の独立性: 各観測値および残差誤差が互いに独立していること(自己相関がないこと)。
3. 等分散性: 説明変数のすべての水準において誤差項の分散が一定であること。
4. 残差の正規性: 誤差項が正規分布に従っていること(有効な信頼区間や仮説検定に必要)。
5. 多重共線性がないこと: 説明変数間に線形従属の関係がないこと(計画行列がフルランクであること)。
残差診断では、以下のように仮定の違反を検出します。
- 残差対予測値プロット(Residuals vs. Fitted Values plot): 曲線や規則的なパターンが見られる場合は非線形性を示し、ファンネル型や扇形の広がりが見られる場合は不等分散性を示します。
- 正規Q-Qプロット(Normal Q-Q plot): 直線の対角線から系統的に逸脱している場合(S字カーブやファットテールなど)、正規性の違反を示します。
- 残差対観測順序/時間プロット(Residuals vs. Order/Time plot): 系統的な傾向や周期的なパターンが見られる場合、誤差の自己相関を示します。
- レバレッジ / クックの距離プロット(Leverage / Cook's Distance plot): 当てはめられたモデルを過度に歪める高レバレッジな外れ値や影響力のある観測点を特定します。
import numpy as np
import statsmodels.api as sm
np.random.seed(42)
X = np.linspace(1, 10, 50)
# Quadratic underlying pattern creates a linearity violation
y = 2 * X + 0.5 * (X ** 2) + np.random.normal(0, 2, 50)
X_with_const = sm.add_constant(X)
model = sm.OLS(y, X_with_const).fit()
residuals = model.resid
print(f"Mean Residual: {np.mean(residuals):.4f}")
print(f"Curvature in residuals indicates model misspecification.")
AI コーチを使ってこの質問に答えてみる
3 ロジスティック回帰はどのようにして2値分類をモデル化するのか、またシグモイド関数はどのような役割を果たしますか?
ロジスティック回帰は、事後クラス確率 $P(Y=1|X)$ を推定することによって2値分類をモデル化します。予測される確率が $(0, 1)$ の範囲内に収まるようにするため、ロジスティック回帰は正例クラスの対数オッズ(ロジット)を入力の線形関数としてモデル化します:$\ln\left(\frac{p}{1-p}\right) = w^T x + b$。シグモイド(ロジスティック)関数 $\sigma(z) = \frac{1}{1 + e^{-z}}$ は連結関数として機能し、任意の実数値である線形スコア $z = w^T x + b \in (-\infty, +\infty)$ を有効な確率 $p \in (0, 1)$ へと単調に写像します。離散的なクラスの決定は判定閾値 $\tau$(通常は 0.5)を適用して行われます:$P(Y=1|X) \ge \tau$ の場合は $\hat{y} = 1$、それ以外は $0$ となります。$\sigma(z) = 0.5$ はまさに $z = 0$ のときに生じるため、特徴量空間における決定境界は線形超平面 $w^T x + b = 0$ となり、標準的なロジスティック回帰は線形分類器となります。
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
w = np.array([1.5, -2.0])
b = 0.5
x = np.array([2.0, 1.0])
z = np.dot(w, x) + b
prob = sigmoid(z)
threshold = 0.5
pred = int(prob >= threshold)
print(f"Log-odds (z): {z:.2f}")
print(f"Probability: {prob:.4f}")
print(f"Class Prediction: {pred}")
AI コーチを使ってこの質問に答えてみる
4 L2正則化とは何ですか?また、Ridge回帰(リッジ回帰)は目的関数と係数の推定値をどのように変化させますか?
L2正則化(Ridge回帰)は、通常の最小二乗法(OLS: Ordinary Least Squares)の損失関数に対して、重みの二乗和に比例するペナルティ項を追加します:$$\min_w \|y - Xw\|_2^2 + \lambda \|w\|_2^2$$ 解析的には、Ridge回帰は逆行列計算の前にグラム行列(Gram matrix)に $\lambda I$ を加算することで正規方程式を変更します:$$w_{\text{ridge}} = (X^T X + \lambda I)^{-1} X^T y$$ 目的関数および係数の推定値に対する主な影響は以下のとおりです:1. 縮減(Shrinkage): 係数は特徴量の分散と相関に比例してゼロ方向に縮減され、係数を完全にゼロにすることなくモデルの複雑度を低減します。2. 多重共線性(マルチコリニアリティ)と逆行列可能性: 特徴量間に共線性がある場合や $p > N$ の場合、$X^T X$ は特異行列または悪条件行列になります。$\lambda I$ を加えることで $(X^T X + \lambda I)$ が厳密に正定値となり逆行列が存在することが保証されるため、パラメータ推定値が安定します。3. バイアスとバリアンスのトレードオフ: $\lambda$ を大きくすると、係数推定値に意図的なバイアスが導入される一方でバリアンスが大幅に低減され、未知のデータに対する汎化誤差の期待値が低下します。4. 特徴量スケーリングの必要性: ペナルティ項はすべての重みを同等に扱うため、スケールが大きい特徴量ほど過剰に正則化されてしまいます。そのため、学習前に特徴量を標準化(平均0、分散1)しておく必要があります。
import numpy as np
def ridge_regression(X, y, alpha):
X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
n_features = X_std.shape[1]
I = np.eye(n_features)
beta = np.linalg.inv(X_std.T @ X_std + alpha * I) @ X_std.T @ y
return beta
X = np.array([[1.0, 2.0], [2.0, 4.1], [3.0, 5.9], [4.0, 8.2]])
y = np.array([2.1, 4.0, 6.2, 8.1])
weights = ridge_regression(X, y, alpha=1.0)
print('Ridge Weights:', weights)
AI コーチを使ってこの質問に答えてみる
5 決定木は特徴空間をどのように再帰的に分割し、分類の分割を選択するためにどのような基準が使用されますか?
決定木は、**再帰的2分割**(recursive binary partitioning)と呼ばれるトップダウンの貪欲アルゴリズムによって特徴空間を分割します。すべての訓練データを含むルートノードから開始し、不純度の減少量が最大となる軸平行な単一の分割点($X_j \le t$)を見つけるために、すべての特徴量と可能な閾値を探索します。データセットは2つの子ノードに分割され、停止基準(例:最大深度、葉ごとの最小サンプル数、またはノードの完全な純粋化)に達するまで、各子ノードに対してこの手順が再帰的に適用されます。分割は閾値に対して一度に1つの特徴量を評価するため、結果として生じる決定境界は直交超平面(特徴空間内の軸に平行な矩形領域)になります。分類木で最適な分割を評価および選択するために、主に2つの不純度基準が使用されます。1. **ジニ不純度(CARTで使用)**:ノードのクラス分布に従ってランダムにラベル付けした場合に、無作為に選んだサンプルが誤分類される確率を測定します。割合 $p_k$ を持つ $K$ クラスの場合:$$I_G = 1 - \sum_{k=1}^K p_k^2$$ 2. **エントロピーと情報利得(ID3やC4.5で使用)**:エントロピーはノード内の不確実性を測定します:$H = -\sum_{k=1}^K p_k \log_2(p_k)$。分割は**情報利得**(Information Gain)を最大化するように選択されます。これは親ノードのエントロピーから子ノードの加重平均エントロピーを差し引いたものです:$$IG = H(\text{parent}) - \sum_{c \in \{\text{left, right}\}} \frac{N_c}{N} H(c)$$ どちらの指標も、ノードが完全に純粋である(すべてのサンプルが単一のクラスに属する)場合は0になり、クラスが均等に分布している場合に最大値をとります。
import numpy as np
def gini(labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / len(labels)
return 1.0 - np.sum(p ** 2)
def entropy(labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / len(labels)
return -np.sum(p * np.log2(p + 1e-12))
# Evenly split node (impure) vs single-class node (pure)
impure_node = np.array([0]*10 + [1]*10)
pure_node = np.array([0]*20)
print(f"Impure - Gini: {gini(impure_node):.2f}, Entropy: {entropy(impure_node):.2f}")
print(f"Pure - Gini: {gini(pure_node):.2f}, Entropy: {entropy(pure_node):.2f}")
AI コーチを使ってこの質問に答えてみる
6 k近傍法(k-NN: k-Nearest Neighbors)とは何ですか。また、分類と回帰においてどのように予測を行いますか。
k近傍法(kNN: k-Nearest Neighbors)は、ノンパラメトリックでインスタンスベース(遅延学習型)の教師あり学習アルゴリズムです。明示的なパラメトリックモデルの学習は行わず、訓練データセットを保持しておき、推論時にすべての計算を実行します。
予測のワークフロー:
1. 距離計算: クエリインスタンスが入力されると、指定された距離尺度(ユークリッド距離、マンハッタン距離、ミンコフスキー距離など)を用いて、保持されているすべての訓練インスタンスとの距離を計算します。
2. 近傍の選択: クエリインスタンスとの距離が最も小さい $k$ 個の訓練インスタンスを選択します。
3. 集約:
- 分類: $k$ 個の近傍における多数決(最頻値)、または距離に応じた重み付け投票によってクラスを割り当てます。
- 回帰: $k$ 個の近傍の目的変数の局所平均(平均値または中央値)、あるいは距離に応じた重み付け平均を算出することで連続値を予測します。
距離計算は特徴量のスケールに直接依存するため、値の絶対値が大きい特徴量が距離計算を支配しないよう、特徴量の正規化や標準化が不可欠です。
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
import numpy as np
X_train = np.array([[1000.0, 1.0], [2000.0, 2.0], [1500.0, 1.5], [5000.0, 5.0]])
y_cls = np.array([0, 0, 0, 1])
y_reg = np.array([10.0, 20.0, 15.0, 50.0])
# Feature scaling is mandatory for distance-based algorithms
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
# 1. Classification (Majority Vote)
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_scaled, y_cls)
# 2. Regression (Local Average)
reg = KNeighborsRegressor(n_neighbors=3)
reg.fit(X_scaled, y_reg)
query = scaler.transform([[1800.0, 1.8]])
print('Classification:', clf.predict(query))
print('Regression:', reg.predict(query))
AI コーチを使ってこの質問に答えてみる
これらの回答を声に出して練習する準備はできていますか?
声で回答し、技術の深さ、構成、英語でのコミュニケーションについてフィードバックを受け取れます。
7 ナイーブベイズの条件付き独立性の仮定を述べ、その仮定が満たされない場合でもナイーブベイズが良好に機能することがある理由を説明してください。
ナイーブベイズの条件付き独立性の仮定とは、クラスラベル Y = y が与えられたとき、すべての特徴量 X_1, X_2, ..., X_d が互いに独立であるという仮定です。すなわち、P(X_1, ..., X_d | Y = y) = \prod_{j=1}^d P(X_j | Y = y) と表されます。
ベイズの定理を用いると、事後確率は P(Y = y | X) \propto P(Y = y) \prod_{j=1}^d P(X_j | Y = y) となります。ここで、P(Y = y) はクラスの事前確率、P(X_j | Y = y) はクラス条件付き尤度(例えば連続特徴量に対するガウス分布や、出現頻度カウントに対する多項分布など)です。
独立性の仮定が崩れている場合でも、実務においてナイーブベイズが良好に機能することが多い理由は、分類が正確な確率キャリブレーションではなく argmax による決定規則(argmax_y P(Y=y | X))に依存しているためです。特徴量間の相関によって予測確率が過度に確信的になったり歪んだりしても、正しいクラスが相対的な順位で最上位を維持することがよくあります。相関によってクラス尤度の順位が入れ替わらない限り、0-1損失に基づく分類決定は正確なまま保たれます。
from sklearn.naive_bayes import GaussianNB
import numpy as np
X = np.array([[1.0, 1.1], [1.2, 0.9], [-1.0, -1.2], [-0.8, -1.1]])
y = np.array([1, 1, 0, 0])
model = GaussianNB()
model.fit(X, y)
# Prediction uses argmax over class posterior scores
print("Predicted class:", model.predict([[1.1, 1.0]]))
AI コーチを使ってこの質問に答えてみる