機械学習/基本理論,予測ペンデータ品目


機械学習の定義

  • AIを実現する方法
  • 具体的な方法をプログラミングすることなく、コンピュータに自分で学ぶ方法を例に示します.

    4つの機械学習に役立つ分野

  • 従来のソリューションでは、手動で調整およびルールを大量に必要とする問題
  • 従来の方法では解決できない複雑な問題(音声認識、顔認識)
  • 絶えず変化する環境に適応する問題
  • 複雑な問題と大量のデータ(データマイニング)を理解する
  • ラベルの付いたトレーニングセットとは何ですか?

  • サポート学習(補習学習)は、明確な答えのあるトレーニングです.
  • 2つの最も一般的な指導学習タスク


    ぶんかつ
  • バイナリ分類:スパムではなく
  • 多分類(多種類分類):犬、猫、鳥分類問題
  • 分類ラベルカテゴリ(犬、猫、鳥)をクラス(クラス)
  • と呼ぶ.
    回帰(Regression)
  • 連続数字
  • の教育程度、年齢、居住地に基づき、年収(目標)
  • を予測する.

    5つのよく使われる非指導学習


    しゅうぐん
  • ブログ訪問者グループ(40%は映画愛好家、20%は読書愛好家)
  • 階層クラスタアルゴリズムを使用すると、各グループをより小さなグループ
  • に細分化することができる.
  • 顧客、市場、ブランド、社会経済活動細分化(細分化)
  • ビジュアル化
  • では、大規模でラベルのない高次元データを2 Dおよび3 Dに変換し、フォーマットできます.
  • は、できるだけ構造を維持し、データから予期せぬモード
  • を発見する.
  • 有意義な群集を強調するT-SNE可視化例:動物は輸送手段とよく区別され、馬は鹿に近いが鳥と
  • 離れている.
    次元を下げる
  • は、多くのデータを失うことなく、
  • を簡略化します.
  • 複数の相互依存関係の特性を結合する
  • e.g.)特性1(車の走行距離)+特性2(軟式)->特性3(車の摩耗):特性抽出(特徴抽出)
  • 次元縮小
  • は、学習を指導するなどの他のアルゴリズムにデータを注入する前にも使用する.
  • は、実行速度、ディスク、メモリ容量、パフォーマンスの向上に役立ちます.
    関連ルールの学習
  • 大量のデータから特性間の興味深い関係を見つける
  • e.g.)スーパーマーケットの販売記録では、「バーベキューソースやジャガイモを購入した人はステーキも購入する」傾向があることが分かった.
  • 規則に基づく学習であり、ネットワーク環境において
  • を提供しない.
    異常検出(異常検出)
  • e.g.)異常信用取引の検出、製造欠陥の検出等
  • .
  • 学習アルゴリズムを入力前に、異常値
  • をデータセットから自動的に削除する.
  • システムは正常サンプルとして訓練され、新しいサンプルは正常サンプルか異常サンプルか
  • と判断する.

    お客様が複数のグループに分かれている場合、どのアルゴリズムを使用しますか?

  • グループの定義がない場合は、学習を指導しないクラスタの階層化クラスタアルゴリズムを使用して、各グループをより小さなグループに細分化します.
  • がどのグループであるかが分かれば,分類アルゴリズム(学習指導)を用いる.
  • ごみ感知の問題は学習を指導することですか?非指導学習?

  • 学習バイナリ分類法
  • オンライン学習システムとは?

  • サンプルまたは「ミニバッチ」(mini-batch)と呼ばれる小バッチトレーニング
  • 学習速度が速く、コストが低く、データがあればすぐに
  • 学習する.
  • データを連続的に受信し、(株価)の急速な変化に適応する必要があるシステムに適している
  • コンピューティングリソースが限られている場合に適用
  • は、使用するサンプル
  • を廃棄するか保存するかを決定する.
  • オンライン学習アルゴリズムは、コンピュータがメインメモリにアクセスできない膨大なデータセットを学習するために使用できます.
  • は、外部メモリ学習
  • と称する.
  • アルゴリズムは部分データを取得し、訓練段階で
  • を実行する.
    すべてのデータが有効になるまで、この手順
  • を繰り返します.
  • インクリメンタルラーニング
    import sklearn
    print(sklearn.__version__)
    from sklearn.datasets import load_iris
    import numpy as np
    import pandas as pd
    iris_dataset = load_iris()
    type(iris_dataset)
    sklearn.utils.Bunch
    iris_dataset.keys()
    dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
  • data:numpy配列
  • 花びらの長さと幅、萼片の長さと幅を数値とする
  • target:アヤメ品種
  • target names:targetの名前
  • feature names:プロパティの名前
  • DESCR:データセットの説明および各特性の説明
  • print(iris_dataset["DESCR"])
    .. _iris_dataset:
    
    Iris plants dataset
    --------------------
    
    **Data Set Characteristics:**
    
        :Number of Instances: 150 (50 in each of three classes)
        :Number of Attributes: 4 numeric, predictive attributes and the class
        :Attribute Information:
            - sepal length in cm
            - sepal width in cm
            - petal length in cm
            - petal width in cm
            - class:
                    - Iris-Setosa
                    - Iris-Versicolour
                    - Iris-Virginica
                    
        :Summary Statistics:
    
        ============== ==== ==== ======= ===== ====================
                        Min  Max   Mean    SD   Class Correlation
        ============== ==== ==== ======= ===== ====================
        sepal length:   4.3  7.9   5.84   0.83    0.7826
        sepal width:    2.0  4.4   3.05   0.43   -0.4194
        petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
        petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
        ============== ==== ==== ======= ===== ====================
    
        :Missing Attribute Values: None
        :Class Distribution: 33.3% for each of 3 classes.
        :Creator: R.A. Fisher
        :Donor: Michael Marshall (MARSHALL%[email protected])
        :Date: July, 1988
    
    The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
    from Fisher's paper. Note that it's the same as in R, but not as in the UCI
    Machine Learning Repository, which has two wrong data points.
    
    This is perhaps the best known database to be found in the
    pattern recognition literature.  Fisher's paper is a classic in the field and
    is referenced frequently to this day.  (See Duda & Hart, for example.)  The
    data set contains 3 classes of 50 instances each, where each class refers to a
    type of iris plant.  One class is linearly separable from the other 2; the
    latter are NOT linearly separable from each other.
    
    .. topic:: References
    
       - Fisher, R.A. "The use of multiple measurements in taxonomic problems"
         Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
         Mathematical Statistics" (John Wiley, NY, 1950).
       - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
         (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.
       - Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
         Structure and Classification Rule for Recognition in Partially Exposed
         Environments".  IEEE Transactions on Pattern Analysis and Machine
         Intelligence, Vol. PAMI-2, No. 1, 67-71.
       - Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactions
         on Information Theory, May 1972, 431-433.
       - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS II
         conceptual clustering system finds 3 classes in the data.
       - Many, many more ...
    iris_dataset["target_names"]
    array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
    iris_dataset["target"]
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
    iris_dataset["feature_names"]
    ['sepal length (cm)',
     'sepal width (cm)',
     'petal length (cm)',
     'petal width (cm)']
    iris_dataset["data"]
    array([[5.1, 3.5, 1.4, 0.2],
           [4.9, 3. , 1.4, 0.2],
           [4.7, 3.2, 1.3, 0.2],
           [4.6, 3.1, 1.5, 0.2],
           [5. , 3.6, 1.4, 0.2],
           [5.4, 3.9, 1.7, 0.4],
           [4.6, 3.4, 1.4, 0.3],
           [5. , 3.4, 1.5, 0.2],
           [4.4, 2.9, 1.4, 0.2],
           [4.9, 3.1, 1.5, 0.1],
           [5.4, 3.7, 1.5, 0.2],
           [4.8, 3.4, 1.6, 0.2],
           [4.8, 3. , 1.4, 0.1],
           [4.3, 3. , 1.1, 0.1],
           [5.8, 4. , 1.2, 0.2],
           [5.7, 4.4, 1.5, 0.4],
           [5.4, 3.9, 1.3, 0.4],
           [5.1, 3.5, 1.4, 0.3],
           [5.7, 3.8, 1.7, 0.3],
           [5.1, 3.8, 1.5, 0.3],
           [5.4, 3.4, 1.7, 0.2],
           [5.1, 3.7, 1.5, 0.4],
           [4.6, 3.6, 1. , 0.2],
           [5.1, 3.3, 1.7, 0.5],
           [4.8, 3.4, 1.9, 0.2],
           [5. , 3. , 1.6, 0.2],
           [5. , 3.4, 1.6, 0.4],
           [5.2, 3.5, 1.5, 0.2],
           [5.2, 3.4, 1.4, 0.2],
           [4.7, 3.2, 1.6, 0.2],
           [4.8, 3.1, 1.6, 0.2],
           [5.4, 3.4, 1.5, 0.4],
           [5.2, 4.1, 1.5, 0.1],
           [5.5, 4.2, 1.4, 0.2],
           [4.9, 3.1, 1.5, 0.2],
           [5. , 3.2, 1.2, 0.2],
           [5.5, 3.5, 1.3, 0.2],
           [4.9, 3.6, 1.4, 0.1],
           [4.4, 3. , 1.3, 0.2],
           [5.1, 3.4, 1.5, 0.2],
           [5. , 3.5, 1.3, 0.3],
           [4.5, 2.3, 1.3, 0.3],
           [4.4, 3.2, 1.3, 0.2],
           [5. , 3.5, 1.6, 0.6],
           [5.1, 3.8, 1.9, 0.4],
           [4.8, 3. , 1.4, 0.3],
           [5.1, 3.8, 1.6, 0.2],
           [4.6, 3.2, 1.4, 0.2],
           [5.3, 3.7, 1.5, 0.2],
           [5. , 3.3, 1.4, 0.2],
           [7. , 3.2, 4.7, 1.4],
           [6.4, 3.2, 4.5, 1.5],
           [6.9, 3.1, 4.9, 1.5],
           [5.5, 2.3, 4. , 1.3],
           [6.5, 2.8, 4.6, 1.5],
           [5.7, 2.8, 4.5, 1.3],
           [6.3, 3.3, 4.7, 1.6],
           [4.9, 2.4, 3.3, 1. ],
           [6.6, 2.9, 4.6, 1.3],
           [5.2, 2.7, 3.9, 1.4],
           [5. , 2. , 3.5, 1. ],
           [5.9, 3. , 4.2, 1.5],
           [6. , 2.2, 4. , 1. ],
           [6.1, 2.9, 4.7, 1.4],
           [5.6, 2.9, 3.6, 1.3],
           [6.7, 3.1, 4.4, 1.4],
           [5.6, 3. , 4.5, 1.5],
           [5.8, 2.7, 4.1, 1. ],
           [6.2, 2.2, 4.5, 1.5],
           [5.6, 2.5, 3.9, 1.1],
           [5.9, 3.2, 4.8, 1.8],
           [6.1, 2.8, 4. , 1.3],
           [6.3, 2.5, 4.9, 1.5],
           [6.1, 2.8, 4.7, 1.2],
           [6.4, 2.9, 4.3, 1.3],
           [6.6, 3. , 4.4, 1.4],
           [6.8, 2.8, 4.8, 1.4],
           [6.7, 3. , 5. , 1.7],
           [6. , 2.9, 4.5, 1.5],
           [5.7, 2.6, 3.5, 1. ],
           [5.5, 2.4, 3.8, 1.1],
           [5.5, 2.4, 3.7, 1. ],
           [5.8, 2.7, 3.9, 1.2],
           [6. , 2.7, 5.1, 1.6],
           [5.4, 3. , 4.5, 1.5],
           [6. , 3.4, 4.5, 1.6],
           [6.7, 3.1, 4.7, 1.5],
           [6.3, 2.3, 4.4, 1.3],
           [5.6, 3. , 4.1, 1.3],
           [5.5, 2.5, 4. , 1.3],
           [5.5, 2.6, 4.4, 1.2],
           [6.1, 3. , 4.6, 1.4],
           [5.8, 2.6, 4. , 1.2],
           [5. , 2.3, 3.3, 1. ],
           [5.6, 2.7, 4.2, 1.3],
           [5.7, 3. , 4.2, 1.2],
           [5.7, 2.9, 4.2, 1.3],
           [6.2, 2.9, 4.3, 1.3],
           [5.1, 2.5, 3. , 1.1],
           [5.7, 2.8, 4.1, 1.3],
           [6.3, 3.3, 6. , 2.5],
           [5.8, 2.7, 5.1, 1.9],
           [7.1, 3. , 5.9, 2.1],
           [6.3, 2.9, 5.6, 1.8],
           [6.5, 3. , 5.8, 2.2],
           [7.6, 3. , 6.6, 2.1],
           [4.9, 2.5, 4.5, 1.7],
           [7.3, 2.9, 6.3, 1.8],
           [6.7, 2.5, 5.8, 1.8],
           [7.2, 3.6, 6.1, 2.5],
           [6.5, 3.2, 5.1, 2. ],
           [6.4, 2.7, 5.3, 1.9],
           [6.8, 3. , 5.5, 2.1],
           [5.7, 2.5, 5. , 2. ],
           [5.8, 2.8, 5.1, 2.4],
           [6.4, 3.2, 5.3, 2.3],
           [6.5, 3. , 5.5, 1.8],
           [7.7, 3.8, 6.7, 2.2],
           [7.7, 2.6, 6.9, 2.3],
           [6. , 2.2, 5. , 1.5],
           [6.9, 3.2, 5.7, 2.3],
           [5.6, 2.8, 4.9, 2. ],
           [7.7, 2.8, 6.7, 2. ],
           [6.3, 2.7, 4.9, 1.8],
           [6.7, 3.3, 5.7, 2.1],
           [7.2, 3.2, 6. , 1.8],
           [6.2, 2.8, 4.8, 1.8],
           [6.1, 3. , 4.9, 1.8],
           [6.4, 2.8, 5.6, 2.1],
           [7.2, 3. , 5.8, 1.6],
           [7.4, 2.8, 6.1, 1.9],
           [7.9, 3.8, 6.4, 2. ],
           [6.4, 2.8, 5.6, 2.2],
           [6.3, 2.8, 5.1, 1.5],
           [6.1, 2.6, 5.6, 1.4],
           [7.7, 3. , 6.1, 2.3],
           [6.3, 3.4, 5.6, 2.4],
           [6.4, 3.1, 5.5, 1.8],
           [6. , 3. , 4.8, 1.8],
           [6.9, 3.1, 5.4, 2.1],
           [6.7, 3.1, 5.6, 2.4],
           [6.9, 3.1, 5.1, 2.3],
           [5.8, 2.7, 5.1, 1.9],
           [6.8, 3.2, 5.9, 2.3],
           [6.7, 3.3, 5.7, 2.5],
           [6.7, 3. , 5.2, 2.3],
           [6.3, 2.5, 5. , 1.9],
           [6.5, 3. , 5.2, 2. ],
           [6.2, 3.4, 5.4, 2.3],
           [5.9, 3. , 5.1, 1.8]])
    iris_dataset["data"].shape
    (150, 4)
    iris_dataset["data"][:5]
    array([[5.1, 3.5, 1.4, 0.2],
           [4.9, 3. , 1.4, 0.2],
           [4.7, 3.2, 1.3, 0.2],
           [4.6, 3.1, 1.5, 0.2],
           [5. , 3.6, 1.4, 0.2]])
    iris_df = pd.DataFrame(data=iris_dataset["data"], columns = iris_dataset["feature_names"] )
    iris_df["label"] = iris_dataset["target"]
    iris_df
    sepal length (cm)
    sepal width (cm)
    petal length (cm)
    petal width (cm)
    label
    0
    5.1
    3.5
    1.4
    0.2
    0
    1
    4.9
    3.0
    1.4
    0.2
    0
    2
    4.7
    3.2
    1.3
    0.2
    0
    3
    4.6
    3.1
    1.5
    0.2
    0
    4
    5.0
    3.6
    1.4
    0.2
    0
    ...
    ...
    ...
    ...
    ...
    ...
    145
    6.7
    3.0
    5.2
    2.3
    2
    146
    6.3
    2.5
    5.0
    1.9
    2
    147
    6.5
    3.0
    5.2
    2.0
    2
    148
    6.2
    3.4
    5.4
    2.3
    2
    149
    5.9
    3.0
    5.1
    1.8
    2
    150 rows × 5 columns
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test  = train_test_split(iris_dataset["data"],iris_dataset["target"], random_state=42 )
    iris_train_df = pd.DataFrame(X_train, columns=iris_dataset['feature_names'])
    pd.plotting.scatter_matrix(iris_train_df, c = y_train, marker='o', cmap='plasma', figsize=(15, 15))
    array([[<AxesSubplot:xlabel='sepal length (cm)', ylabel='sepal length (cm)'>,
            <AxesSubplot:xlabel='sepal width (cm)', ylabel='sepal length (cm)'>,
            <AxesSubplot:xlabel='petal length (cm)', ylabel='sepal length (cm)'>,
            <AxesSubplot:xlabel='petal width (cm)', ylabel='sepal length (cm)'>],
           [<AxesSubplot:xlabel='sepal length (cm)', ylabel='sepal width (cm)'>,
            <AxesSubplot:xlabel='sepal width (cm)', ylabel='sepal width (cm)'>,
            <AxesSubplot:xlabel='petal length (cm)', ylabel='sepal width (cm)'>,
            <AxesSubplot:xlabel='petal width (cm)', ylabel='sepal width (cm)'>],
           [<AxesSubplot:xlabel='sepal length (cm)', ylabel='petal length (cm)'>,
            <AxesSubplot:xlabel='sepal width (cm)', ylabel='petal length (cm)'>,
            <AxesSubplot:xlabel='petal length (cm)', ylabel='petal length (cm)'>,
            <AxesSubplot:xlabel='petal width (cm)', ylabel='petal length (cm)'>],
           [<AxesSubplot:xlabel='sepal length (cm)', ylabel='petal width (cm)'>,
            <AxesSubplot:xlabel='sepal width (cm)', ylabel='petal width (cm)'>,
            <AxesSubplot:xlabel='petal length (cm)', ylabel='petal width (cm)'>,
            <AxesSubplot:xlabel='petal width (cm)', ylabel='petal width (cm)'>]],
          dtype=object)
    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=1)  
    knn.fit(X_train, y_train)
    KNeighborsClassifier(n_neighbors=1)
    y_pred = knn.predict(X_test)
    y_pred
    array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2,
           0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0])
    y_test
    array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2,
           0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0])
    y_pred == y_test
    array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True])
    # 정확도(1)
    np.mean(y_pred == y_test)
    1.0
    X_new = np.array([[5, 2.9, 1.0, 0.2]])
    knn.predict(X_new)
    array([0])
    * 정확도 : 전체 label 중에 맞은 예측의 갯수   38/38 = 1.0
    # 정확도(2)
    knn.score(X_test, y_test)
    1.0
    # 정확도(3)
    from sklearn.metrics import accuracy_score
    accuracy_score(y_test, y_pred)
    1.0