Q6 - cross-validation

Hello.
I’m already read all topics about Q6, despite improving my code while reading, I’m still not able to run cross-validation. Can someone help me?

ames_housing = pd.read_csv("../datasets/house_prices.csv", na_values="?")
ames_housing = ames_housing.drop(columns="Id")

target_name = "SalePrice"

data, target = ames_housing.drop(columns=target_name), ames_housing[target_name]
target = (target > 200_000).astype(int)#labeling true or false

data_num_name = ["LotFrontage", "LotArea", "MasVnrArea", "BsmtFinSF1", "BsmtFinSF2",
  "BsmtUnfSF", "TotalBsmtSF", "1stFlrSF", "2ndFlrSF", "LowQualFinSF",
  "GrLivArea", "BedroomAbvGr", "KitchenAbvGr", "TotRmsAbvGrd", "Fireplaces",
  "GarageCars", "GarageArea", "WoodDeckSF", "OpenPorchSF", "EnclosedPorch",
  "3SsnPorch", "ScreenPorch", "PoolArea", "MiscVal"]

data_cat_name = data.columns.difference(data_num_name)

data_num = data[data_num_name]
data_cat = data[data_cat_name]

preprocessing_num = make_pipeline(StandardScaler(), SimpleImputer(strategy="mean"))
preprocessing_cat = make_pipeline(SimpleImputer(strategy="most_frequent"),OneHotEncoder(handle_unknown='ignore'))

preprocessing = ColumnTransformer(transformers=[('numerical-preprocessing', preprocessing_num, data_num),
                                  ('categorical-preprocessing', preprocessing_cat, data_cat)])

model = make_pipeline(preprocessing, LogisticRegression(max_iter=500))

cv_score = cross_validate(model, data, target)

/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan.

[…]

ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

warnings.warn(“Estimator fit failed. The score on this train-test”

The entire error message.

/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 341, in fit
    Xt = self._fit(X, y, **fit_params_steps)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 303, in _fit
    X, fitted_transformer = fit_transform_one_cached(
  File "/opt/conda/lib/python3.9/site-packages/joblib/memory.py", line 352, in __call__
    return self.func(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 754, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 505, in fit_transform
    self._validate_remainder(X)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in _validate_remainder
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in <genexpr>
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/utils/__init__.py", line 268, in _determine_key_type
    raise ValueError(err_msg)
ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

  warnings.warn("Estimator fit failed. The score on this train-test"
/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 341, in fit
    Xt = self._fit(X, y, **fit_params_steps)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 303, in _fit
    X, fitted_transformer = fit_transform_one_cached(
  File "/opt/conda/lib/python3.9/site-packages/joblib/memory.py", line 352, in __call__
    return self.func(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 754, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 505, in fit_transform
    self._validate_remainder(X)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in _validate_remainder
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in <genexpr>
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/utils/__init__.py", line 268, in _determine_key_type
    raise ValueError(err_msg)
ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

  warnings.warn("Estimator fit failed. The score on this train-test"
/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 341, in fit
    Xt = self._fit(X, y, **fit_params_steps)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 303, in _fit
    X, fitted_transformer = fit_transform_one_cached(
  File "/opt/conda/lib/python3.9/site-packages/joblib/memory.py", line 352, in __call__
    return self.func(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 754, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 505, in fit_transform
    self._validate_remainder(X)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in _validate_remainder
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in <genexpr>
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/utils/__init__.py", line 268, in _determine_key_type
    raise ValueError(err_msg)
ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

  warnings.warn("Estimator fit failed. The score on this train-test"
/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 341, in fit
    Xt = self._fit(X, y, **fit_params_steps)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 303, in _fit
    X, fitted_transformer = fit_transform_one_cached(
  File "/opt/conda/lib/python3.9/site-packages/joblib/memory.py", line 352, in __call__
    return self.func(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 754, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 505, in fit_transform
    self._validate_remainder(X)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in _validate_remainder
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in <genexpr>
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/utils/__init__.py", line 268, in _determine_key_type
    raise ValueError(err_msg)
ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

  warnings.warn("Estimator fit failed. The score on this train-test"
/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py:615: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
Traceback (most recent call last):
  File "/opt/conda/lib/python3.9/site-packages/sklearn/model_selection/_validation.py", line 598, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 341, in fit
    Xt = self._fit(X, y, **fit_params_steps)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 303, in _fit
    X, fitted_transformer = fit_transform_one_cached(
  File "/opt/conda/lib/python3.9/site-packages/joblib/memory.py", line 352, in __call__
    return self.func(*args, **kwargs)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/pipeline.py", line 754, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 505, in fit_transform
    self._validate_remainder(X)
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in _validate_remainder
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/compose/_column_transformer.py", line 324, in <genexpr>
    self._has_str_cols = any(_determine_key_type(cols) == 'str'
  File "/opt/conda/lib/python3.9/site-packages/sklearn/utils/__init__.py", line 268, in _determine_key_type
    raise ValueError(err_msg)
ValueError: No valid specification of the columns. Only a scalar, list or slice of all integers or all strings, or boolean mask is allowed

  warnings.warn("Estimator fit failed. The score on this train-test"

A ColumnTransformer does not request the data but the name of the column. So you should not pass data_cat and data_num but instead data_num_name and data_cat_name only. The transformer will be in charge of selecting the data internally when calling fit.

aaaaaaaaaaaaaaaaaaaaaah this clarify a lot. I thought by passing the data, I would be passing the data types to ColumnTransformer so it knows what to do on each data, but passing the columns also passes that information, but a lot easier.

Thank you very much.