Scikit Learn OneHotEncoder подходит и преобразуется Ошибка: ValueError: X имеет другую форму, чем во время установки

Ниже мой код.

Я знаю, почему ошибка происходит во время преобразования. Это из-за несоответствия списка функций во время подгонки и преобразования. Как я могу это решить? Как я могу получить 0 для всех остальных функций?

После этого я хочу использовать это для частичной подгонки classификатора SGD.

Jupyter QtConsole 4.3.1 Python 3.6.2 |Anaconda custom (64-bit)| (default, Sep 21 2017, 18:29:43) Type 'copyright', 'credits' or 'license' for more information IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help. import pandas as pd from sklearn.preprocessing import OneHotEncoder input_df = pd.DataFrame(dict(fruit=['Apple', 'Orange', 'Pine'], color=['Red', 'Orange','Green'], is_sweet = [0,0,1], country=['USA','India','Asia'])) input_df Out[1]: color country fruit is_sweet 0 Red USA Apple 0 1 Orange India Orange 0 2 Green Asia Pine 1 filtered_df = input_df.apply(pd.to_numeric, errors='ignore') filtered_df.info() # apply one hot encode refreshed_df = pd.get_dummies(filtered_df) refreshed_df  RangeIndex: 3 entries, 0 to 2 Data columns (total 4 columns): color 3 non-null object country 3 non-null object fruit 3 non-null object is_sweet 3 non-null int64 dtypes: int64(1), object(3) memory usage: 176.0+ bytes Out[2]: is_sweet color_Green color_Orange color_Red country_Asia \ 0 0 0 0 1 0 1 0 0 1 0 0 2 1 1 0 0 1 country_India country_USA fruit_Apple fruit_Orange fruit_Pine 0 0 1 1 0 0 1 1 0 0 1 0 2 0 0 0 0 1 enc = OneHotEncoder() enc.fit(refreshed_df) Out[3]: OneHotEncoder(categorical_features='all', dtype=, handle_unknown='error', n_values='auto', sparse=True) new_df = pd.DataFrame(dict(fruit=['Apple'], color=['Red'], is_sweet = [0], country=['USA'])) new_df Out[4]: color country fruit is_sweet 0 Red USA Apple 0 filtered_df1 = new_df.apply(pd.to_numeric, errors='ignore') filtered_df1.info() # apply one hot encode refreshed_df1 = pd.get_dummies(filtered_df1) refreshed_df1  RangeIndex: 1 entries, 0 to 0 Data columns (total 4 columns): color 1 non-null object country 1 non-null object fruit 1 non-null object is_sweet 1 non-null int64 dtypes: int64(1), object(3) memory usage: 112.0+ bytes Out[5]: is_sweet color_Red country_USA fruit_Apple 0 0 1 1 1 enc.transform(refreshed_df1) --------------------------------------------------------------------------- ValueError Traceback (most recent call last)  in () ----> 1 enc.transform(refreshed_df1) ~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in transform(self, X) 2073 """ 2074 return _transform_selected(X, self._transform, -> 2075 self.categorical_features, copy=True) 2076 2077 ~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in _transform_selected(X, transform, selected, copy) 1810 1811 if isinstance(selected, six.string_types) and selected == "all": -> 1812 return transform(X) 1813 1814 if len(selected) == 0: ~/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/data.py in _transform(self, X) 2030 raise ValueError("X has different shape than during fitting." 2031 " Expected %d, got %d." -> 2032 % (indices.shape[0] - 1, n_features)) 2033 2034 # We use only those categorical features of X that are known using fit. ValueError: X has different shape than during fitting. Expected 10, got 4. 

Вместо использования pd.get_dummies() вам нужен LabelEncoder + OneHotEncoder, который может хранить исходные значения, а затем использовать их для новых данных.

Изменение кода, как показано ниже, даст вам необходимые результаты.

 import pandas as pd from sklearn.preprocessing import OneHotEncoder, LabelEncoder input_df = pd.DataFrame(dict(fruit=['Apple', 'Orange', 'Pine'], color=['Red', 'Orange','Green'], is_sweet = [0,0,1], country=['USA','India','Asia'])) filtered_df = input_df.apply(pd.to_numeric, errors='ignore') # This is what you need le_dict = {} for col in filtered_df.columns: le_dict[col] = LabelEncoder().fit(filtered_df[col]) filtered_df[col] = le_dict[col].transform(filtered_df[col]) enc = OneHotEncoder() enc.fit(filtered_df) refreshed_df = enc.transform(filtered_df).toarray() new_df = pd.DataFrame(dict(fruit=['Apple'], color=['Red'], is_sweet = [0], country=['USA'])) for col in new_df.columns: new_df[col] = le_dict[col].transform(new_df[col]) new_refreshed_df = enc.transform(new_df).toarray() print(filtered_df) color country fruit is_sweet 0 2 2 0 0 1 1 1 1 0 2 0 0 2 1 print(refreshed_df) [[ 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0.] [ 0. 1. 0. 0. 1. 0. 0. 1. 0. 1. 0.] [ 1. 0. 0. 1. 0. 0. 0. 0. 1. 0. 1.]] print(new_df) color country fruit is_sweet 0 2 2 0 0 print(new_refreshed_df) [[ 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0.]] 

Вы кодировщик установлен на refreshed_df который содержит 10 столбцов, а ваш refreshed_df1 содержит только 4, что буквально то, о чем сообщается в ошибке. Вам нужно либо удалить столбцы, которые не отображаются на вашем refreshed_df1 либо просто поместить ваш кодер в новую версию refreshed_df которая содержит только 4 столбца, отображаемых в refreshed_df1 .

  • Неконтролируемый анализ настроений
  • Как понять местность чувствительного хеширования?
  • Пример 10-кратной classификации СВМ в MATLAB
  • Как Keras оценивает точность?
  • Дискуссия classового дисбаланса: масштабирование вклада в потери и sgd
  • Давайте будем гением компьютера.