ValueError при попытке создать фрейм данных с результатами OneHotEncoder - PullRequest
0 голосов
/ 18 июня 2020

Недавно я начал изучать python, чтобы разработать прогнозную модель для исследовательского проекта с использованием методов машинного обучения. Я использовал OneHotEncoder для кодирования всех категориальных переменных в моем наборе данных

    # Encode categorical data with oneHotEncoder
    from sklearn.preprocessing import OneHotEncoder
    ohe = OneHotEncoder(handle_unknown='ignore')
    Z = ohe.fit_transform(Z)

Теперь я хочу создать фрейм данных с результатами OneHotEncoder. Я хочу, чтобы столбцы фрейма данных были новыми категориями, полученными в результате кодирования, поэтому я использую атрибут Categories_ . При запуске следующей строки кода:

    ohe_df = pd.DataFrame(Z, columns=ohe.categories_)

я получаю сообщение об ошибке: ValueError: все массивы должны быть одинаковой длины

Я понимаю, что упомянутые массивы в сообщении об ошибке представлены массивы категорий, каждая из которых имеет разную длину в зависимости от количества категорий, которые она содержит, но я не уверен, каков правильный способ создания фрейма данных с новыми категориями в качестве столбцов (когда есть несколько

Я попытался сделать это с небольшим набором данных, который содержал только одну функцию, и это сработало:

    ohe = OneHotEncoder(handle_unknown='ignore', sparse=False)
    df = pd.DataFrame(['Male', 'Female', 'Female'])
    results = ohe.fit_transform(df)

    ohe_df = pd.DataFrame(results, columns=ohe.categories_)
    ohe_df.head()
    
        Female  Male
    0   0.0     1.0
    1   1.0     0.0
    2   1.0     0.0

Итак, как мне сделать то же самое для моего большого набора данных с многочисленными функциями .

Заранее спасибо.

РЕДАКТИРОВАТЬ:

По запросу я придумал MWE, чтобы продемонстрировать, как он не работает:


    import numpy as np
    import pandas as pd
    
    # create dataframe 
    df = pd.DataFrame(np.array([['Male', 'Yes', 'Forceps'], ['Female', 'No', 'Forceps and ventouse'],
                                 ['Female','missing','None'], ['Male','Yes','Ventouse']]), 
                      columns=['gender', 'diabetes', 'assistance'])
    
    df.head()
    
    # encode categorical data 
    from sklearn.preprocessing import OneHotEncoder
    
    ohe = OneHotEncoder(handle_unknown='ignore')
    results = ohe.fit_transform(df)
    print(results)

На этом этапе я создал фрейм данных категориальных данных и закодировал его. Теперь я хочу создать еще один фрейм данных, чтобы столбцы нового фрейма данных были категориями, созданными OneHotEncoder, а строки - закодированными данными. Для этого я попробовал две вещи:

    ohe_df = pd.DataFrame(results, columns=np.concatenate(ohe.categories_))

И я попробовал:

    ohe_df = pd.DataFrame(results, columns=ohe.get_feature_names(input_features=df.columns))

Что привело к ошибке: ValueError: Форма переданных значений (4, 1) индексы подразумевают (4, 9)

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

IIU C,

import numpy as np
import pandas as pd

# create dataframe 
df = pd.DataFrame(np.array([['Male', 'Yes', 'Forceps'], ['Female', 'No', 'Forceps and ventouse'],
                            ['Female','missing','None'], ['Male','Yes','Ventouse']]), 
                    columns=['gender', 'diabetes', 'assistance'])

df.head()

# encode categorical data 
from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(handle_unknown='ignore')
results = ohe.fit_transform(df)
df_results = pd.DataFrame.sparse.from_spmatrix(results)
df_results.columns = ohe.get_feature_names(df.columns)
df_results

Вывод:

   gender_Female  gender_Male  diabetes_No  diabetes_Yes  diabetes_missing  assistance_Forceps  assistance_Forceps and ventouse  assistance_None  assistance_Ventouse
0            0.0          1.0          0.0           1.0               0.0                 1.0                              0.0              0.0                  0.0
1            1.0          0.0          1.0           0.0               0.0                 0.0                              1.0              0.0                  0.0
2            1.0          0.0          0.0           0.0               1.0                 0.0                              0.0              1.0                  0.0
3            0.0          1.0          0.0           1.0               0.0                 0.0                              0.0              0.0                  1.0

Обратите внимание, что вывод ohe.fit_transform(df) представляет собой разреженную матрицу.

print(type(results))
<class 'scipy.sparse.csr.csr_matrix'>

Вы можете преобразовать это в фрейм данных, используя pd.DataFrame.sparse.from_spmatrix. Затем мы можем использовать ohe.get_feature_names и передать исходные столбцы фрейма данных, чтобы назвать ваши столбцы в фрейме данных результатов, df_results.

3 голосов
/ 18 июня 2020

ohe.categories_ - это список массивов, по одному массиву для каждой функции. Вам нужно сгладить это в одномерный список / массив для pd.DataFrame, например, с np.concatenate(ohe.categories_).

Но, вероятно, лучше использовать встроенный метод get_feature_names.

...