教師あり学習と呼ばれている機械学習というなにがしか
外れ値、一般に値が大きくずれている、例外的なものに対してどう反応する?
カテゴリーを表す数値をどう処理している?(1と2には量的な関係がない場合)
などなど機械学習と呼ばれているものの中身がよくわからなかったので。
いくつかの説明変数から目的変数を予測する関数を求めるのが教師あり学習。
テストデータ(説明変数と目的変数が揃っているデータ)を二つに分けて、「学習(モデル作り、関数作り)が適切か」を人が判断します。(これでいいのか?もっと良くなるから頑張ろう!とモデルを試行錯誤し続けるのが強化学習)
計算させてるだけぢゃないか。
と思う。
学習とは何だろうか。
教師ありというが、
情報の塊ぢゃないのか。
よく言っても、教材、ではないのか。
教師とは何だろう。
と思う。
与えられた情報に対して、誰もが(機械が)同じ結論を出す情報処理を、学習というのだろうか。
コンピューターは「学習」できるのか?疑問は募るばかり。
学習者(モデル)によって学習の仕方が違う。
学習者の特徴別に説明。
重回帰LinearRegression
重回帰分析とは?
単回帰分析はバラ付きのあるデータに直線的な関係を見出し、未知の値を予測する(法則性を見つける)分析方法です。未知の目的変数yの値を予測するために、説明変数xについてy = a + bx1 + cx2 + ・・・が成立するような切片aと定数(回帰係数)b,c…. を求めてくれます。(これは学習なのか???)
ある直線を引いた時に、できるだけ「距離が小さく」なるようにコンピューターが計算してくれます。(これは、学習と言えるのか?計算してもらってるだけじゃ?)
重回帰分析は、次元が一つだけではなく、いくつかの評価変数を足し合わせた上で「直線」を引きます。複数の対応が目的変数に係る(影響する)ため、二次元のグラフでは書き表せません。
わかりやすい図がありました。この図は三次元ですが、評価変数が増えると図示できなくなります。
重回帰分析は単回帰分析を重ね合わせたものだと思って良いのでしょうか。
次のコマンドで重回帰モデルで学習してくれる。
# データ分割(訓練データとテストデータ)のためのインポート
from sklearn.model_selection import train_test_split
# 重回帰のモデル構築のためのインポート
from sklearn.linear_model import LinearRegression
# 目的変数にscoreを指定、説明変数にそれ以外を指定
X = df.drop('score', axis=1)
y = df['score']
# 訓練データとテストデータに分ける(test_size=0.5であれば半分を学習train用、もう半分を答え合わせtestに使う)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# 重回帰クラスの初期化と学習(LinearRegressionを使いなさいと述べ、fitで学習してもらう)
model = LinearRegression()
model.fit(X_train, y_train)
# 決定係数を表示
print('決定係数(train):{:.3f}'.format(model.score(X_train, y_train)))
print('決定係数(test):{:.3f}'.format(model.score(X_test, y_test)))
# 回帰係数と切片を表示
print('\n回帰係数\n{}'.format(pd.Series(model.coef_, index=X.columns)))
print('切片: {:.3f}'.format(model.intercept_))
決定係数から予測の精度を読み取ることができます。目的変数が分かっている訓練データと目的変数が分かっていないテストデータの説明変数のが「違う」と値が異なってくる。値が大きく違えば、正しい予測ができているとは言えないらしい。決定係数は予測の精度を表す。(決定係数が異なれば「過学習」が起きていると考える)
回帰係数は線形関数の傾きを表します。傾きが大きいほど、目的変数に与える影響が大きいです。回帰係数を求めることは、「どの説明変数がより目的変数を説明できているか」を知る手がかりになります。偏回帰係数は重回帰分析をしたときの回帰係数、単回帰分析をしたときには単回帰係数と呼ばれます。
説明変数の選択方法とモデル評価
例えば次のように、説明変数を限定して(選択して)分析させることができます。
boston_df = pd.DataFrame(boston.data, columns = boston.feature_names)
そもそも、説明変数を選択する(限定する)ことでより良い学習が可能になるのか。
だとすれば、説明変数を選ぶ基準は何か。
疑問です。
このサイトが熱い。
変数増加法(前進的選択法)、変数減少法(後退的選択法)変数増減法(ステップワイズ法)
などと言われる方法。

選択変数を選択することで「より良いモデル」が作れたと評価する基準も様々。
RMSE(Root Mean Squared Error)、赤池情報量規準(AIC)、ベイズ情報量規準(BIC)
ロジスティック回帰分析
ロジステック回帰分析は、目的変数が数値ではなくカテゴリーである時に使うようです。例えば「この人はこの商品を買うか、買わないか」といった予測に使います。
どこかで線引きをするイメージでしょうか。
ただ、「はい」か「いいえ」を判断するのではないようです。ロジスティック関数は「確率」を表し0から1の値が返ってくるそうです。「説明変数がこの値なら、目的変数が「YES」をとる確率は○%」と教えてくれる模様。
確率?
横軸の説明変数、二つ以上だったらどうするの?と思っていたら。
重回帰モデルの回帰式を使うそうだ。
pは説明変数が決まると出てくる確率。
この式を満たすようなpを見つけることを学習と呼ぶのだろうか???
コマンドは次の通り。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 「fin_flg」カラムを追加し、もし「flg-50K」カラムの値が「>50K」だったら1、そうでなければ0をセットする
adult['fin_flg'] = adult['flg-50K'].map(lambda x: 1 if x == ' >50K' else 0)
adult.groupby('fin_flg').size()
# 説明変数と目的変数の設定
X = adult[['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss']]
y = adult['fin_flg']
# 訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# ロジスティック回帰クラスの初期化と学習
model = LogisticRegression()
model.fit(X_train, y_train)
print('正解率(train):{:.3f}'.format(model.score(X_train, y_train)))
print('正解率(test):{:.3f}'.format(model.score(X_test, y_test)))
重回帰分析と書き方が少し違うようです。説明変数と目的変数を列で指定しています・・ね?
重回帰モデルの亜種、のように思える。
スケーリング・標準化・正規化
回帰係数の注意書き。回帰係数が与えられる説明変数の単位(?スケール?)が違うと、影響力が変わってきます。回帰係数を見比べるなら標準化してからが良いそうです(見比べないにしても、標準化したほうがいい?)。


調べたら色々出てきます。
https://qiita.com/0NE_shoT_/items/08376b08783cd554b02e
統計分析では因果関係は分からず、相関関係だけ出てくることに注意!
数の量の重みが、説明変数ごとに異なると、説明変数の数の重みが当然変わってきます。
とある説明変数は「金額」を表し数値が「1から10000」までを表すとします。別の変数は「年齢」を表して「1から100」までを表すとします。すると、数値に重みがあるのは(より目的変数に影響を及ぼすのは)当然、数値が大きい「金額」になってしまいます。しかし果たして本当にそうなんだろうか?
というわけで標準化(数値の重みを平らにする)をしてから学習させることでより精度の高い予測ができるそうです。標準化を勝手にやってくれるコマンドがあるそう。
# 標準化のためのクラスをインポート
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# Xとyを設定
X = adult[['age', 'fnlwgt', 'education-num', 'capital-gain', 'capital-loss']]
y = adult['fin_flg']
# 訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
# 標準化処理
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
# ロジスティック回帰クラスの初期化と学習
model = LogisticRegression()
model.fit(X_train_std, y_train)
# 正解率の表示
print('正解率(train):{:.3f}'.format(model.score(X_train_std, y_train)))
print('正解率(test):{:.3f}'.format(model.score(X_test_std, y_test)))
コメント