スパルタ-機械学習1週間

9039 ワード

1.概要


アルゴリズム#アルゴリズム#


ある問題を解決するために制定された一連のプログラムまたは方法は、計算を式化した形式で表現または実行する段階的なプログラムである.
試験の前にコーヒーを何杯飲んだら、翌日の試験は何点取れますか.
Score = 10*Coffee+40
今日の温度と湿度のデータは明日のスモッグ濃度を予測できますか?
-->予測が困難
-->機械学習の出現

2.回帰と分類


機械学習で問題を解く場合,問題を解く方法は回帰と分類に分けられる.

回帰


人の顔写真を見て何歳の問題を当てる.
このとき入力値は「顔写真」、出力値は「予測年齢」となります.

上記のように連続した出力値で問題を予測する方法を回帰と呼ぶ.

ぶんかつ


大学受験の前日に勉強した時間を利用して、その科目が直せるかどうかを予測する問題を解決します.
この場合、入力値は「学習時間」、出力値は「完了するかどうか」となります.
このタスクを完了するかどうかは、0,1つのバイナリクラスに分けることができます.
この分類方法をバイナリ分類と呼ぶ.
ここで、出力値を[成績(A,B,C,D,F)]ではなく[完了したかどうか]に変更すると、5つのクラスが表示されます.この分類方法を多重分類と呼ぶ.

*回帰と分類を同時に行います!


回帰から解いた年齢問題から年齢を範囲に分けて考える

前述したように、年齢範囲をカテゴリに分類すると、回帰問題は多重分類問題に変換される.

3.指導/非指導/強化学習


学習を指導する.


  • 学生に正解の教え方

  • 機械に入力値と出力値を表示し、学習する

  • 正解がなければ不可能な学習方法

  • 実際の操作では、入力値に対応するデータが含まれているが、出力値に対応するデータがない場合、次の操作が実行されます.
    -->これを「ラベルリング」または「コメント」と呼びます.
  • 非指導学習


  • 正解を教えずにクラスタ化する方法

  • パケットアルゴリズムの性質
    ex)音源ファイルを分析し、ジャンルを流行、ロック、クラシック、ダンスの問題に分ける

  • クラスタ、ビジュアル化、関連ルール学習など
  • 学習を強化する.


  • 指定されたデータなしで実行とエラーを繰り返す方法
    Alphago誕生の機械学習方法

  • 分類する必要のないデータや分類する必要のないデータは、自分の行為に対する奨励と学習を得ることができます.

  • 学習の概念を強化する
  • エージェント(Agent)
  • 環境
  • 状態
  • 行動
  • 奨励
  • ゲームを例にとると、ゲームルールを単独で入力するのではなく、自分がゲーム環境の中で現在の状態から高い点数を取る方法を探し、行動的な学習方法で特定の学習回数を超えることで、高い点数を得ることができる戦略が形成される.
    この場合,行動のための行動ディレクトリ(方向キー,ボタン)などは事前に定義する必要がある.

    4.線形回帰


    線形回帰と仮定,損失関数[Cost関数]


    試験前日に飲んだコーヒーカップの数によって試験点数を予測する問題を解決する

    上記のデータから以下のグラフが得られる.
  • 上図により,任意の直線でこの図を近似的に表す仮定を得ることができる.
  • H(x) = Wx + b
  • の試験点数を正確に予測するためには、任意の直線(仮定)と点(答え)の距離を近づけるべきである.
  • Mean二乗誤差:直線と各点距離の二乗を加算した平均値
  • Mean absolute error
  • 直線H(x)と点の距離が小さいほど学習が良いモデルを評価した.
  • H(x)-->仮定(Hypothesis)
  • 距離(Cost)-->損失関数
  • *多重線形回帰


    線形回帰では、入力変数が複数ある場合は、多重線形回帰が使用されます.
  • H=w 1 x 1+w 2 x 2+...+wnxn+b
  • 損失関数のコストは線形回帰と同じ
  • である.

    5.勾配降下法


    傾斜降下法とは何ですか。


    損失関数には次の形式があると仮定します.

    ソース:https://towardsdatascience.com/using-machine-learning-to-predict-fitbit-sleep-scores-496a7d9ec48

  • グラフに沿って下に下がると、損失関数を最小限に抑えることができます.

  • このとき,コンピュータはランダムに1つの点から始まり,左右に1点移動し,以前の値よりも多くの値を観察し,グラフィックの最小点に達したときに学習を終了する.

  • このとき左右に移動する単位を学習率と呼び,上記の方法を傾斜降下法と呼ぶ.

  • 学習率が小さすぎると、出発点から最小点を探すのに多くの時間がかかります-->学習に多くの時間がかかります

  • 学習率が大きすぎると、最小値を超え、振動が最も激しい場合に発散する可能性があります-->Overshooting
  • 実際の損失関数はどうですか。


    実際の損失関数は,次のように描写できない,想像できない形式である.

    ソース:https://regenerativetoday.com/logistic-regression-with-python-and-scikit-learn/

  • デルの目標は、世界で最も低いコストを見つけることです.

  • 学習率を誤って設定すると、ローカルコストの最小化に陥り、学習を終了します.

  • これにより、モデルの精度が低下します.

  • 従って,グローバル最小値を探すために良い仮定と良い損失関数が必要である.
  • 6.データセット分割


    学習/検証/テストデータ



    ソース:https://3months.tistory.com/118

  • トレーニングセット=教科書
    80%のデータセットを使用してマシン学習モデルを学習

  • Validation set=模擬試験
    機械学習モデルの性能の指標を検査し調整する
    モデルに直接データを表示しないため、モデルのパフォーマンスXに影響します.

  • テストセット=大学入試
    実際の環境に正しいラベルがない評価データセット
  • 7.実習


    線形回帰コードの実行

  • テンセントストリームポート&設定データと変数
  • import tensorflow as tf
    
    tf.compat.v1.disable_eager_execution()
    
    x_data = [[1,1], [2,2], [3,3]]
    y_data = [[10], [20], [30]]
    
    X = tf.compat.v1.placeholder(tf.float32, shape[None,2])
    Y = tf.compat.v1.placeholder(tf.float32, shape[None,1])
    
    W = tf.Variable(tf.random.normal(shape=(2,1)), name='W')
    b = tf.Variable(tf.random.normal(shape=(1,)), name='b')
  • 仮定とコスト関数、オプティマイザ定義
  • hypothesis = tf.matmul(X,W) + b
    cost = tf.reduce_mean(tf.square(hypothesis - Y))
    optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
  • は、ステップごとに結果を出力し、コスト削減関数
  • を確保する.
    with tf.compat.v1.Session() as sess:
    sessrun(tf.compat.v1.global_variables_initializer())
    
    for step in range(50):
    c, W_, b_, _ = sess.run([cost, W, b, optimizer], feed_dict={X: x_data, Y: y_data})
    print('Step: %2d\t loss: %.2f\t' % (step,, c))
    
    print(sess.run(hypothesis, feed_dict={X: [[4, 4]]})
  • 実際にKears
  • を使用
    import numpy as np
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.optimizers import Adam, SGD
    
    x_data = np.array([1], [2], [3])
    y_data = np.array([[10], [20], [30]])
    
    model = Sequential([
    Dense(1)
    ])
    
    model.compile(loss='mean_squared_error', optimizer = SGD(lr=0.1)
    
    model.fit(x_data, y_data, epochs=100)
    y_pred = model.predict([[4]])
    print(y_pred)

    Kglobleデータを用いた線形回帰実験

  • 必要ライブラリ
  • をインポートする.
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.optimizers import Adam, SGD
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt 
    import seaborn as sns
    from sklearn.model_selection import train_test_split
  • データセットを読み込み、その形状を確認します.
  • df = pd.read_csv('advertising.csv')
    df.head(5)
    print(df.shape)
  • データセット
  • の表示
    sns.pairplot(df, x_vars=['TV', 'Newspaper', 'Radio'], y_vars=['Sales'], height=4)
    加工
  • データセット
  • x_data = np.array(df[['TV']], dtype=np.float32)
    y_data = np.array(df['Sales'], dtype=np.float32)
    
    print(x_data.shape)
    print(y_data.shape)
    x_data = x_data.reshape((-1, 1))
    y_data = y_data.reshape((-1, 1))
    
    print(x_data.shape)
    print(y_data.shape)
  • データセットは学習データと検証データ
  • に分割する.
    x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
    
    print(x_train.shape, x_val.shape)
    print(y_train.shape, y_val.shape)
  • 学習
  • model = Sequential([
      Dense(1)
    ])
    
    model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1))
    
    model.fit(
        x_train,
        y_train,
        validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
        epochs=100 # epochs 복수형으로 쓰기!
    )
  • 検証データ予測
  • y_pred = model.predict(x_val)
    
    plt.scatter(x_val, y_val)
    plt.scatter(x_val, y_pred, color='r')
    plt.show()
  • 複数のX値を利用して収入
  • を予測する.
    ```python
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.optimizers import Adam, SGD
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt 
    import seaborn as sns
    from sklearn.model_selection import train_test_split
    
    df = pd.read_csv('advertising.csv')
    
    x_data = np.array(df[['TV', 'Newspaper', 'Radio']], dtype=np.float32)
    y_data = np.array(df['Sales'], dtype=np.float32)
    
    x_data = x_data.reshape((-1, 3))
    y_data = y_data.reshape((-1, 1))
    
    print(x_data.shape)
    print(y_data.shape)
    
    x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
    
    print(x_train.shape, x_val.shape)
    print(y_train.shape, y_val.shape)
    
    model = Sequential([
      Dense(1)
    ])
    
    model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.1))
    
    model.fit(
        x_train,
        y_train,
        validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
        epochs=100 # epochs 복수형으로 쓰기!
    )