Классификатор случайного леса ValueError: Вход содержит NaN, бесконечность или значение, слишком большое для dtype ('float32') - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь применить метод RandomForest к набору данных и получаю эту ошибку:

ValueError: Input contains NaN, infinity or a value too large for dtype ('float32')

Может кто-нибудь сказать мне, что я могу изменить в функции, чтобы код работал:

def ranks_RF(x_train, y_train, features_train, RESULT_PATH='Results'):
    """Get ranks from Random Forest"""

    print("\nMétodo_Random_Forest")

    random_forest = RandomForestRegressor(n_estimators=10)
    np.nan_to_num(x_train)
    np.nan_to_num(y_train)
    random_forest.fit(x_train, y_train)

    # Get rank by doing two times a sort.
    imp_array = np.array(random_forest.feature_importances_)
    imp_order = imp_array.argsort()
    ranks = imp_order.argsort()

    # Plot Random Forest
    imp = pd.Series(random_forest.feature_importances_, index=x_train.columns)
    imp = imp.sort_values()

    imp.plot(kind="barh")
    plt.xlabel("Importance")
    plt.ylabel("Features")
    plt.title("Feature importance using Random Forest")
    # plt.show()
    plt.savefig(RESULT_PATH + '/ranks_RF.png', bbox_inches='tight')

    return ranks

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы не перезаписали значения, когда вы заменили nan, следовательно, он дает вам ошибки.

Мы используем пример набора данных:

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

from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(data= iris['data'],
                     columns= iris['feature_names'] )
df['target'] = iris['target']
# insert some NAs
df = df.mask(np.random.random(df.shape) < .1)

У нас есть такая функция, как ваша, Я удалил часть построения, потому что это совсем другой вопрос:

def ranks_RF(x_train, y_train):

    var_names = x_train.columns
    random_forest = RandomForestRegressor(n_estimators=10)
# here you have to reassign back the values
    x_train = np.nan_to_num(x_train)
    y_train = np.nan_to_num(y_train)
    random_forest.fit(x_train, y_train)

    res = pd.DataFrame({
    "features":var_names,
    "importance":random_forest.feature_importances_,
    })
    res = res.sort_values(['importance'],ascending=False)
    res['rank'] = np.arange(len(res))+1

    return res

Мы запустили его:

ranks_RF(df.iloc[:,0:4],df['target'])

    features    importance  rank
3   petal width (cm)    0.601734    1
2   petal length (cm)   0.191613    2
0   sepal length (cm)   0.132212    3
1   sepal width (cm)    0.074442    
0 голосов
/ 16 февраля 2020

С помощью np.isnan (X) вы возвращаете логическую маску с True для позиций, содержащих NaN.

С помощью np.where (np.isnan (X)) вы получаете кортеж с i, j координаты NaN.

Наконец, с помощью np.nan_to_num (X) вы «заменяете nan на ноль, а inf на конечные числа».

...