機械学習のマルチ出力

人工知能アルゴリズムのタスクは、提供されたサンプルに基づいて、後続のデータ予測のために学習することです。 ただし、ほとんどの教科書で説明されている最も一般的なタスクは、1つの値、1つまたは別の記号セットの予測です。 フィードバックが必要な場合はどうなりますか? つまり、1つ以上の値に基づいて特定の数の記号を取得します。



この種のタスクに直面し、数学的統計と確率理論のセクションに深い知識を持っていませんでした-私にとってこれは小さな研究であることが判明しました。



だから、私が最初に知ったのは、失われたデータを平均で回復する方法です。 したがって、私はscikit-learn-Imputerが提供するクラスを使用しました。 資料を参照して、私は明確にすることができます:

Imputerクラスは、失われたデータを含む列または行の平均値、中央値、または最も一般的な値を使用して、失われた値を回復するための基本的な戦略を提供します。
結果は役に立たないという理解にもかかわらず、私はこのクラスを使用しようとすることに決めました。実際に起こったことは次のとおりです。



import pandas as pd from sklearn.preprocessing import Imputer from sklearn.model_selection import train_test_split url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data' df = pd.read_csv(url, header=None) df.columns = ['', '', ' ', '', ' ', '', ' ', '', ' ', '', ' ', '', 'OD280/OD315  ', ''] imp = Imputer(missing_values='NaN', strategy='mean') imp.fit(df) imp.transform([[3, 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN']])
      
      





 array([[3.00000000e+00, 1.30006180e+01, 2.33634831e+00, 2.36651685e+00, 1.94949438e+01, 9.97415730e+01, 2.29511236e+00, 2.02926966e+00, 3.61853933e-01, 1.59089888e+00, 5.05808988e+00, 9.57449438e-01, 2.61168539e+00, 7.46893258e+02]])
      
      





RandomForestClassifierクラスのデータを検証しようとすると、彼は私たちに同意せず、この値の配列は最初のクラスに正確に対応し、3番目のクラスには対応しないと一般に信じていました。



さて、このメソッドが私たちに適していないことに気付いた後、MultiOutputRegressorクラスに目を向けます。 MultiOutputRegressorは、マルチターゲット回帰をサポートしないリグレッサ専用に設計されています。 最小二乗法への影響を確認しましょう。



 from sklearn.datasets import make_regression from sklearn.multioutput import MultiOutputRegressor X, y = make_regression(n_features=1, n_targets=10) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4) multioutput = MultiOutputRegressor(LinearRegression()).fit(X_train, y_train) print("   : {:.2f}".format(multioutput.score(X_test, y_test))) print("   : {:.2f}".format(multioutput.score(X_train, y_train)))
      
      





    : 0.82    : 0.83
      
      





結果はかなり良いです。 アクションのロジックは非常に単純です。出力フィーチャのセットの各要素に個別のリグレッサを適用することになります。

それは:



 class MultiOutputRegressor__: def __init__(self, est): self.est = est def fit(self, X, y): g, h = y.shape self.estimators_ = [sklearn.base.clone(self.est).fit(X, y[:, i]) for i in range(h)] return self.estimators_ def predict(self, X): res = [est.predict(X)[:, np.newaxis] for est in self.estimators_] return np.hstack(res)
      
      







次に、実際のデータでマルチターゲット回帰をサポートするRandomForestRegressorクラスの動作を確認しましょう。



 df = df.drop([''], axis=1) X, y = df[['', '']], df.drop(['', ''], axis=1) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1) forest = RandomForestRegressor(n_estimators=30, random_state=13) forest.fit(X_train, y_train) print("   : {:.2f}".format(forest.score(X_test, y_test))) print("   :{:.2f}".format(forest.score(X_train, y_train)))
      
      





    : 0.65    :0.87
      
      





プロアントシアニジンに関して一部の人々を誤解させないために



実際に
プロアントシアニジンは天然の化合物です。 主にブドウの骨と皮に見られますが、オークにも見られ、オーク樽で熟成するとワインに入ります。 プロアントシアニジンの分子量は、ワインの熟成時間によって異なります。 古いワイン-より多くのワインがあります(非常に古いワインの場合、分子量は減少します)。



赤ワインの抵抗に大きく影響します。



結果は合成データよりも悪いです(ランダムフォレストは99%実行されます)。 ただし、標識の追加により、改善が期待されます。



マルチ出力方法を使用すると、多くの興味深い問題を解決し、本当に必要なデータを取得できます。



All Articles