Как решить ноутбук Jupyter python - PullRequest
0 голосов
/ 03 апреля 2020

Я использовал ноутбук Jupyter, чтобы узнать о ML. Я использую электронную книгу под названием " TensorFlow за 1 день. Создайте свою собственную нейронную сеть ".

На странице 219, "Шаг 3) Создайте конвейер":

Пожалуйста см. ниже код Как это решить? Я не могу пропустить эту главу 2 ночи, пожалуйста, помогите мне в решении этого дела.

import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import os, ssl
if (not os.environ.get('PYTHONHTTPSVERIFY', '') and
getattr(ssl, '_create_unverified_context', None)):ssl._create_default_https_context = ssl._create_unverified_context

## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education','education_num', 'marital','occupation', 'relationship', 'race', 'sex','capital_gain', 'capital_loss','hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH,skipinitialspace=True,names = COLUMNS,index_col=False)

## List Categorical
CATE_FEATURES =df_train.iloc[:,:-1].select_dtypes('object').columns
print(CATE_FEATURES)
## List continuous
CONTI_FEATURES = df_train._get_numeric_data()

## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education','education_num', 'marital','occupation', 'relationship', 'race', 'sex','capital_gain', 'capital_loss','hours_week', 'native_country', 'label']

### Define continuous list
CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num','capital_loss', 'hours_week']

### Define categorical list
CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation','relationship', 'race', 'sex', 'native_country']

## Prepare the data
features = ['age','workclass', 'fnlwgt', 'education','education_num', 'marital','occupation', 'relationship', 'race', 'sex','capital_gain', 'capital_loss','hours_week', 'native_country']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH, skipinitialspace=True, names =COLUMNS, index_col=False)
df_train[CONTI_FEATURES]=df_train[CONTI_FEATURES].astype('float64')

## Drop Netherland, because only one row
df_train = df_train[df_train.native_country != "HolandNetherlands"]

## Get the column index of the categorical features
conti_features = []
for i in CONTI_FEATURES:
    position = df_train.columns.get_loc(i)
    conti_features.append(position)

## Get the column index of the categorical features
categorical_features = []
for i in CATE_FEATURES:
    position = df_train.columns.get_loc(i)
    categorical_features.append(position)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =train_test_split(df_train[features],df_train.label,test_size = 0.2,random_state=0)

from sklearn.preprocessing import StandardScaler, OneHotEncoder,LabelEncoder
from sklearn.compose import ColumnTransformer,make_column_transformer
from sklearn.pipeline import make_pipeline

preprocess = make_column_transformer((conti_features, StandardScaler()),(categorical_features, OneHotEncoder(sparse=False)))

preprocess.fit_transform(X_train).shape

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-47-a826a21eeb4b> in <module>()
----> 1 preprocess.fit_transform(X_train).shape

~\Anaconda3\envs\hello-tf\lib\site-packages\sklearn\compose\_column_transformer.py in fit_transform(self, X, y)
    512             self._feature_names_in = None
    513         X = _check_X(X)
--> 514         self._validate_transformers()
    515         self._validate_column_callables(X)
    516         self._validate_remainder(X)

~\Anaconda3\envs\hello-tf\lib\site-packages\sklearn\compose\_column_transformer.py in _validate_transformers(self)
    285                                 "transform, or can be 'drop' or 'passthrough' "
    286                                 "specifiers. '%s' (type %s) doesn't." %
--> 287                                 (t, type(t)))
    288 
    289     def _validate_column_callables(self, X):

TypeError: All estimators should implement fit and transform, or can be 'drop' or 'passthrough' specifiers. '[0, 2, 10, 4, 11, 12]' (type <class 'list'>) doesn't.

Сейчас я все еще нахожу, как решить это в Google, но ни у кого нет такой же проблемы, как у меня.

1 Ответ

1 голос
/ 03 апреля 2020

Возможно, вы перепутали порядок параметров до make_column_transformer. Вот пример из документов :

>>> from sklearn.preprocessing import StandardScaler, OneHotEncoder
>>> from sklearn.compose import make_column_transformer
>>> make_column_transformer(
...     (StandardScaler(), ['numerical_column']),
...     (OneHotEncoder(), ['categorical_column']))
ColumnTransformer(transformers=[('standardscaler', StandardScaler(...),
                                 ['numerical_column']),
                                ('onehotencoder', OneHotEncoder(...),
                                 ['categorical_column'])])

Посмотрите, как появились сначала трансформаторы, а затем список столбцов. В вашем коде порядок обратный, и, конечно, списки столбцов не могут fit_transform.

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

...