ValueError: ввод содержит NaN, даже при использовании SimpleImputer

Я пытаюсь работать с Titanic Dataset в качестве своего первого проекта Kaggle, и я столкнулся с этой ошибкой. Я продолжал искать решение здесь, в стеке, но до сих пор не могу его понять.

Я создал два конвейера для предварительной обработки числовых и категориальных функций:

num_pipeline = Pipeline([
            ('imputer', SimpleImputer( strategy='median')), 
            ('scaler', StandardScaler())])
    
cat_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder()) ])

а затем я объединил их в ColumnTransformer

preprocessor = ColumnTransformer(
        transformers = [
            ('num', num_pipeline, numeric_features),
            ('cat', cat_pipeline, categorical_features) ])

numeric_features и category_features - список числовых и категориальных характеристик:

numeric_features = ['Age', 'SibSp', 'Parch', 'Fare']
categorical_features = ['Pclass', 'Sex',  'Embarked']

Наконец, в моем последнем конвейере я добавляю классификатор:

knn = Pipeline([
    ('Preprocessor' , preprocessor),
    ('Classifier', KNeighborsClassifier())
])
knn.fit(X_train, y_train)

Вот когда я получаю ValueError: Input содержит NaN


person MedCh    schedule 14.01.2021    source источник


Ответы (1)


train = pd.read_csv('train.csv')
train.isna().sum()

Выход:

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

Столбцы Age, Cabin и Embarked содержат значения NaN. Однако вы не включаете столбец Cabin в numeric_features или categorical_features, поэтому его значения не рассчитываются. Вот почему вы получаете ошибку.

person Akash Haridas    schedule 14.01.2021
comment
Спасибо за ваш ответ. Я попытался добавить «Cabin» к category_features, но это все еще не работает. - person MedCh; 14.01.2021
comment
@MedCh Можете ли вы сделать preprocessor.fit_transform(X_train) и запустить df.isna().sum() в результате этого? Это покажет вам, какие функции все еще имеют значения NaN. - person Akash Haridas; 14.01.2021
comment
preprocessor.fit_transform (X_train) возвращает массив, поэтому при подсчете нулевых значений возвращается 0: count=0 for i in range(len(df)): for j in df[i]: if np.isnan(i): count+=1 i+=1 count - person MedCh; 14.01.2021
comment
Я только что заметил: ваш конвейер называется knn, а вы вызываете rf.fit(). Что такое rf? - person Akash Haridas; 14.01.2021
comment
Извините, это должно быть knn.fit (). Я допустил ошибку при копировании с Jupyter. - person MedCh; 14.01.2021
comment
Я запустил ваш код, используя train.csv, загруженный с Kaggle, и он не вызвал ошибку ValueError. Я не уверен, почему это происходит с тобой - person Akash Haridas; 14.01.2021