#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()
его результат? Это покажет вам, какие функции все еще имеют значения NaN3. 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.