多変量分類
バイナリ分類器は、前に導入され、データは2つのカテゴリに分けることができる(例えば、「数5」と「しない番号5」)。(また、多項式分類器とも呼ばれる)多価分類器は、二つ以上のカテゴリを区別することができます。
(例えば、ランダムフォレストまたはナイーブベイズのような)いくつかのアルゴリズムは、直接複数のカテゴリを扱うことができます。このようSVMなどの他は、線形分類器は、厳密には、バイナリ分類器です。しかし、我々はまだ多機能分類を達成するために、バイナリ分類器を作るためにさまざまな方法がたくさんあります。
実施例10は、バイナリ分類器を訓練される10回のクラス(0-9)に、例えば、一つのデジタル手書き、各バイナリ分類器は、数(例えばクラシファイア0-、1-分類子を分類しました2-分類器、等...)。次に、分類器に送られたすべての画像を、画像分類を行い、そして最高意思決定、この絵はどのカテゴリに属するかを決定するために彼らの意思決定ポイントに、最終的なスコアを取得します。これは、1対休憩として知られている1対のすべて(OVA)戦略、と呼ばれています。
次の2のカテゴリ0と1、0と分類のための1、1、2、というように[カテゴリ:別の戦略は、数字のペアごとに分類器を訓練することです。これは、1対1(OVO)戦略と呼ばれています。Nクラスがある場合は、我々は×(N-1)/ 2分類器をNを訓練する必要があります。MNISTの問題のために、それは45進分類器、非常に時間がかかり、面倒を養成することを意味します。主な利点OVO:各分類はだけトレーニングセットの一部に必要とされる(データの2つのカテゴリを区別するためのトレーニングセット必要性の一部を含む)に訓練することができます。
そのデータセットの拡大、独自のを拡大し、改善の余地として持っていないと、このようなSVMなどのいくつかのアルゴリズムが、それは、OVOより適しています。これは、大規模なトレーニングセットにいくつかの分類器を訓練する必要がなく、多くの小規模の複数の分類器の訓練セットで訓練することができます。ほとんどのバイナリ分類アルゴリズムであるために、OVAがより適切です。
複数の分類を訓練するために、バイナリ分類アルゴリズムを使用している場合には、SK-学び、それが自動的に(SVMを除き、それは自動的にOVOを使用します)OVAを実行します。レッツ・トライSGDClassifier:
sgd_clf.fit(X_train、y_train) sgd_clf.predict(X_test [: 5 ]) > [ 7 2 1 0 4]
私たちは、使い方が非常に簡単で見ることができます。それの下では、実際には、それは10進分類器の訓練で、判定カテゴリ分類の決定を取るために最高のスコアをスコア10の分類に絵を予測するとき。
さらに、検証、我々はdecision_function()メソッドを呼び出すことができ、それが返されたデータのそれぞれの割合が、10ポイント、各カテゴリーのスコアではありません。
sgd_clf.decision_function(X_test [1 ]) >アレイ([ -27972.77566096、-52417.77039463、-14344.98217961 、 -1308.44575644、-19922.84531732、-9208.91066356 、 -38331.13646795、8007.54256279、-4273.31795296 、 -5951.32911022 ]]) np.argmax( digit_scores) > 7 sgd_clf.classes_ >配列([0、 1、2、3、4、5、6、7、8、9]、DTYPE = UINT8) sgd_clf.classes_ [ 7 ] > 7
私たちは、最高のスコアが7で見ることができるので、最終的には数7のように分類されます。
分類器はよく訓練された後、それは順序の値の大きさに応じて、そのclasses_プロパティに格納されたリストとしてカテゴリを対象とします。ことに留意すべきです。この例では、各カテゴリに対応classes_配列インデックス(例えば、インデックス値が5正確番号5に相当する)だけのカテゴリであるが、通常の状況下で起こる、実際にはそうではないであろう。
私たちは強制的にSK-学ぶことが1対1または1対のすべてを使用する場合は、OneVsOneClassifier使用したりOneVsRestClassifierクラスすることができます。私たちはすることができ、バイナリ分類器のインスタンスを1つだけ作成する必要があり、その後、そのコンストラクタに渡されました。例えば、次のコードはSGDClassifierに基づいているOVOの戦略を使用してマルチ分類器を作成します。
sklearn.multiclass インポートOneVsOneClassifier ovo_clf = OneVsOneClassifier(SGDClassifier(random_state = 42 )) ovo_clf.fit(X_train、y_train) ovo_clf.predict(X_test [: 5 ]) >アレイ([ 7、2、1、0、4] DTYPE = UINT8) LEN(ovo_clf.estimators_) > 45
私たちは、45訓練されたバイナリ分類器の合計を見ることができます。
ここでは、速く、以前の速度よりも非常にシンプルで、RandomForestClassifierを訓練します:
forest_clf.fit(X_train、y_train) forest_clf.predict(X_test [: 5 ]) >アレイ([ 7、2、1、0、4]、DTYPE = UINT8)
ランダムフォレスト分類器は、直接のカテゴリにデータを分類することができるので、SK-leranは、卵子または卵を実行しません。私たちは、それぞれのデータが各カテゴリの確率として分類されている取得します)(predict_probaを呼び出すことができます。
forest_clf.predict_proba(X_test [1:2 ]) >アレイ([[0、0、 0.7、0.2、0.1、0.1、0.1 、0、0、0]])
この分類器は、確信の70%がこの写真は数2である第二のカテゴリー(0から始まる)に属していることを信じることがわかります。これは、それぞれ20%及び10%の確信度に対応する、この画像3,6の一部と見なされるべきです。
以前のように次は、我々はクロスバリデーションを使用して、これらの分類を評価します。SGDClassifierの精度を評価するためcross_val_score()メソッドを使用します。
cross_val_score(sgd_clf、X_train、y_train、CV = 3、スコア= ' 精度' ) >アレイ([ 0.87082583、0.87089354、0.88628294])
すべてのテストをオフに見ることができ、登録率は87%に達しました。それは完全にランダムな分類器である場合、その正解率は10%でなければなりません。10%の正解率に関しては、私たちの分類器はかなり良く、明らかであるが、あなたはより良い行うことができます。例えば、彼らは標準化を行います。
sklearn.preprocessing インポートStandardScaler スケーラ = StandardScaler() X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) cross_val_score(sgd_clf、X_train_scaled、y_train、CV = 3、スコア= ' 精度' ) >アレイ([ 0.89957009、 0.89344467、0.89963495])
私たちは、89%以上増加すると正解率を見ることができます。機械学習プロジェクトのプロセスに基づいたトレーニングモデル、終了後、次のステップは、我々は法の誤差解析は、コンテンツが次の提示されているモデルを最適化しようとします。