web-dev-qa-db-ja.com

Scikit-learn-ValueError:入力にNaN、無限大、またはランダムフォレストを使用したdtype( 'float32')には大きすぎる値が含まれています

まず、このエラーに関するさまざまな投稿を確認しましたが、どれも私の問題を解決できません。

そのため、RandomForestを使用しており、フォレストを生成して予測を行うことができますが、フォレストの生成中に次のエラーが発生することがあります。

ValueError:入力にNaN、無限大、またはdtype( 'float32')に対して大きすぎる値が含まれています。

このエラーは、同じデータセットで発生します。データセットがトレーニング中にエラーを作成することがありますが、ほとんどの場合はエラーを作成しません。エラーは、トレーニングの開始時と途中で発生する場合があります。

これが私のコードです:

import pandas as pd
from sklearn import ensemble
import numpy as np

def azureml_main(dataframe1 = None, dataframe2 = None):

    # Execution logic goes here

    Input = dataframe1.values[:,:]
    InputData = Input[:,:15]
    InputTarget = Input[:,16:]

    limitTrain = 2175

    clf = ensemble.RandomForestClassifier(n_estimators = 10000, n_jobs = 4 );

    features=np.empty([len(InputData),10])
    j=0
    for i in range (0,14):
        if (i == 1 or i == 4 or i == 5 or i == 6 or i == 8 or i == 9 or  i == 10 or i == 11 or i == 13 or i == 14):
            features[:,j] = (InputData[:, i])
            j += 1     

    clf.fit(features[:limitTrain,:],np.asarray(InputTarget[:limitTrain,1],dtype = np.float32))

    res = clf.predict_proba(features[limitTrain+1:,:])

    listreu = np.empty([len(res),5])
    for i in range(len(res)):
        if(res[i,0] > 0.5):
            listreu[i,4] = 0;
        Elif(res[i,1] > 0.5):
            listreu[i,4] = 1;
        Elif(res[i,2] > 0.5):
            listreu[i,4] = 2;
        else:
            listreu[i,4] = 3;


    listreu[:,0] = features[limitTrain+1:,0]
    listreu[:,1] = InputData[limitTrain+1:,2]
    listreu[:,2] = InputData[limitTrain+1:,3]
    listreu[:,3] = features[limitTrain+1:,1]



    # Return value must be of a sequence of pandas.DataFrame
    return pd.DataFrame(listreu),

私は自分のコードをローカルでAzure ML St​​udioとエラーは、どちらの場合も発生します。

ほとんどの場合エラーが発生せず、別の入力からデータセットを自分で生成しているため、データセットが原因ではないと確信しています。

これは 私が使用するデータセットの一部

[〜#〜] edit [〜#〜]私はおそらく実際の0値ではない0値を持っていることが好きでした。値は次のようでした

3.0x10 ^ -314

3
Thomas R

編集の問題を修正したので、エラーはもうありません。 3.0x10 ^ -314の値をゼロに置き換えるだけです。

0
Thomas R

私はあなたのデータフレームのどこかにあなたが時々nan値を持っていると思います。

これらは、を使用して簡単に削除できます

dataframe1 = dataframe1.dropna()

ただし、このアプローチでは、貴重なトレーニングデータが失われる可能性があるため、dfのnanセルの値を増やすために、.fillna()またはsklearn.preprocessing.Imputerを調べる価値がある場合があります。

Dataframe1のソースを確認しないと、完全な/完全な答えを出すのは困難ですが、ある種のトレイン、テスト分割が行われ、データフレームが通過するのは時々nan値のみになる可能性があります。

1
Kieran Lavelle

Float32の代わりにfloat64を使用してみてください。編集:-それを行ったデータセットを表示

0
Simba