Ошибка значения: ввод содержит NaN, даже при использовании SimpleImputer

#python #scikit-learn #pipeline

#python #scikit-learn #конвейер

Вопрос:

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

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

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

а затем я объединил их в колонный трансформатор

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

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

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

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

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

Вот когда я получаю «Ошибка значения: ввод содержит NaN»

Ответ №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 , поэтому его значения не вменяются. Вот почему вы получаете ошибку.

Комментарии:

1. Спасибо за ваш ответ. Я попытался добавить ‘Cabin’ в categorical_features, и он все еще не работает.

2. @MedCh Можете ли вы сделать preprocessor.fit_transform(X_train) и запустить df.isna().sum() его результат? Это покажет вам, какие функции все еще имеют значения NaN

3. 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

4. Я только что заметил: ваш конвейер вызывается knn , но вы вызываете rf.fit() . Что такое rf ?

5. Извините за это, это должно быть knn.fit(). Я допустил ошибку при копировании с Jupyter.