он работает нормально, как показать X в формате данных? я

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

Я получаю ошибку значения, пожалуйста, помогите.

ДФФ

     Country    Name
 0     AUS      Sri
 1     USA      Vignesh
 2     IND      Pechi
 3     USA      Raj

Сначала я выполнил labelencoding,

X=dff.values
label_encoder=LabelEncoder()
X[:,0]=label_encoder.fit_transform(X[:,0])

out:
X
array([[0, 'Sri'],
       [2, 'Vignesh'],
       [1, 'Pechi'],
       [2, 'Raj']], dtype=object)

затем выполнил одно горячее кодирование для того же X

onehotencoder=OneHotEncoder( categorical_features=[0])
X=onehotencoder.fit_transform(X).toarray()

Я получаю следующую ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-472-be8c3472db63> in <module>()
----> 1 X=onehotencoder.fit_transform(X).toarray()

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py in fit_transform(self, X, y)
   1900         """
   1901         return _transform_selected(X, self._fit_transform,
-> 1902                                    self.categorical_features, copy=True)
   1903 
   1904     def _transform(self, X):

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\preprocessing\data.py in _transform_selected(X, transform, selected, copy)
   1695     X : array or sparse matrix, shape=(n_samples, n_features_new)
   1696     """
-> 1697     X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
   1698 
   1699     if isinstance(selected, six.string_types) and selected == "all":

C:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    380                                       force_all_finite)
    381     else:
--> 382         array = np.array(array, dtype=dtype, order=order, copy=copy)
    383 
    384         if ensure_2d:

ValueError: could not convert string to float: 'Raj'

Пожалуйста, измените мой вопрос, что-то не так, заранее спасибо!

 Vivek Kumar13 дек. 2017 г., 11:50
Почему ты не меняешь'Name' столбец с цифрами, как вы сделали для'Country', OneHotEncoder обрабатывает только числовой X. Поэтому удалите его из X перед отправкой в ​​OneHotEncoder или преобразуйте в числовой.
 pyd13 дек. 2017 г., 11:57
Я прошел только один рядX[:,0]=onehotencoder.fit_transform(X[:,0]).toarray() но до сих пор\sklearn\utils\validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. DeprecationWarning)
 pyd13 дек. 2017 г., 12:21
@AruneshSingh, спасибо, можно ли опубликовать твой ответ с моими данными? Я попытался изменить форму и получилDataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True) и мой выводarray([[1.0, 2], [2.0, 3], [1.0, 0], [2.0, 1]], dtype=object) это должно быть 1 или 0 правильно?
 Vivek Kumar13 дек. 2017 г., 12:41
Это всего лишь предупреждения, поэтому они не будут мешать вашим результатам.
 Arunesh Singh13 дек. 2017 г., 12:14
Да, это потому, что вы передаете массив rank1, т.е.X[:,0] вonehotencoder.fit_transform что устарело. Итак, вам нужно изменить его, выполнивX[:,0].reshape(-1,1) или с помощьюnp.newaxis.

Ответы на вопрос(3)

если вы хотите закодировать несколько категориальных объектов, является использование конвейера с FeatureUnion и пары пользовательских преобразователей.

Сначала нужно два преобразователя - один для выбора одного столбца и один для обеспечения возможности использования LabelEncoder в конвейере (метод fit_transform принимает только X, для работы в конвейере требуется дополнительный y).

from sklearn.base import BaseEstimator, TransformerMixin

class SingleColumnSelector(TransformerMixin, BaseEstimator):
    def __init__(self, column):
        self.column = column

    def transform(self, X, y=None):
        return X[:, self.column].reshape(-1, 1)

    def fit(self, X, y=None):
        return self

class PipelineAwareLabelEncoder(TransformerMixin, BaseEstimator):
    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        return LabelEncoder().fit_transform(X).reshape(-1, 1)

Затем создайте конвейер (или просто FeatureUnion), который имеет 2 ветви - по одной для каждого из категориальных столбцов. В каждом столбце выбора 1 закодируйте метки, а затем одну горячую.

import pandas as pd
import numpy as np

from sklearn.preprocessing import LabelEncoder, OneHotEncoder, FunctionTransformer
from sklearn.pipeline import Pipeline, make_pipeline, FeatureUnion

pipeline = Pipeline([(
    'encoded_features',
    FeatureUnion([('countries',
        make_pipeline(
            SingleColumnSelector(0),
            PipelineAwareLabelEncoder(),
            OneHotEncoder()
        )), 
        ('names', make_pipeline(
            SingleColumnSelector(1),
            PipelineAwareLabelEncoder(),
            OneHotEncoder()
        ))
    ]))
])

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

df = pd.DataFrame([["AUS", "Sri"],["USA","Vignesh"],["IND", "Pechi"],["USA","Raj"]], columns=['Country', 'Name'])
X = df.values
transformed_X = pipeline.fit_transform(X)
print(transformed_X.toarray())

Что возвращает (первые 3 столбца - страны, вторые 4 - имена)

[[ 1.  0.  0.  0.  0.  1.  0.]
 [ 0.  0.  1.  0.  0.  0.  1.]
 [ 0.  1.  0.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.]]
Решение Вопроса

Вы можете пойтинепосредственно вOneHotEncoding в настоящее времябез с помощьюLabelEncoderи по мере перехода к версии 0.22 многие могут захотеть сделать что-то таким образом, чтобы избежать предупреждений и потенциальных ошибок (видетьDOCS а такжеПРИМЕРЫ).

Пример кода 1, где закодированы ВСЕ столбцы и где категории указаны явно:
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

data= [["AUS", "Sri"],["USA","Vignesh"],["IND", "Pechi"],["USA","Raj"]]

df = pd.DataFrame(data, columns=['Country', 'Name'])
X = df.values

countries = np.unique(X[:,0])
names = np.unique(X[:,1])

ohe = OneHotEncoder(categories=[countries, names])
X = ohe.fit_transform(X).toarray()

print (X)
Вывод для примера кода 1:
[[1. 0. 0. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0. 0. 1.]
 [0. 1. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 1. 0. 0.]]
Пример кода 2, показывающий опцию 'auto' для спецификации категорий:

Первые 3 столбца кодируют названия стран, последние четыре - личные имена.

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

data= [["AUS", "Sri"],["USA","Vignesh"],["IND", "Pechi"],["USA","Raj"]]

df = pd.DataFrame(data, columns=['Country', 'Name'])
X = df.values

ohe = OneHotEncoder(categories='auto')
X = ohe.fit_transform(X).toarray()

print (X)
Вывод для примера кода 2 (так же, как для 1):
[[1. 0. 0. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0. 0. 1.]
 [0. 1. 0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 1. 0. 0.]]
Пример кода 3, где только первый столбец является одним горячим кодированием:

Теперь вот уникальная часть. Что если вам нужно только одно горячее кодирование определенного столбца для ваших данных?

(Примечание: Я оставил последний столбец в виде строк для упрощения иллюстрации. На самом деле это имеет больше смысла, когда последний столбец уже был числовым).

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

data= [["AUS", "Sri"],["USA","Vignesh"],["IND", "Pechi"],["USA","Raj"]]

df = pd.DataFrame(data, columns=['Country', 'Name'])
X = df.values

countries = np.unique(X[:,0])
names = np.unique(X[:,1])

ohe = OneHotEncoder(categories=[countries]) # specify ONLY unique country names
tmp = ohe.fit_transform(X[:,0].reshape(-1, 1)).toarray()

X = np.append(tmp, names.reshape(-1,1), axis=1)

print (X)
Выход для примера кода 3:
[[1.0 0.0 0.0 'Pechi']
 [0.0 0.0 1.0 'Raj']
 [0.0 1.0 0.0 'Sri']
 [0.0 0.0 1.0 'Vignesh']]

что ввод onehotencoderfit_transform не должен быть массивом 1 ранга, а также вывод редкий, и мы использовалиto_array() расширить его.

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

data= [["AUS", "Sri"],["USA","Vignesh"],["IND", "Pechi"],["USA","Raj"]]


df = pd.DataFrame(data, columns=['Country', 'Name'])
X = df.values

le = LabelEncoder()
X_num = le.fit_transform(X[:,0]).reshape(-1,1)

ohe = OneHotEncoder()
X_num = ohe.fit_transform(X_num)

print (X_num.toarray())

X[:,0] = X_num

print (X)
 pyd14 дек. 2017 г., 05:52
он работает нормально, как показать X в формате данных? я

Ваш ответ на вопрос