【问题标题】:How encode categorical data without affecting numerical data in a DataFrame?如何在不影响 DataFrame 中的数值数据的情况下对分类数据进行编码?
【发布时间】:2020-03-17 01:56:14
【问题描述】:
     Loan_ID    Gender  Married Dependents  Education   ApplicantIncome
1   LP001003    Male     Yes        1       Graduate       4583
2   LP001005    Male     Yes        0       Graduate       3000
3   LP001006    Male     Yes        0       Not Graduate   2583
4   LP001008    Male     No         0       Graduate       6000
5   LP001011    Male     Yes        2       Graduate       5417

如何在不影响的情况下对“性别”、“已婚”、“教育”列进行编码 “Loan_ID”、“家属”、“ApplicantIncome”列。

【问题讨论】:

  • 你试过什么?你做过研究吗?
  • 我试过“df.apply(LabelEncoder().fit_transform)”这行得通,但是当我可以用另一个数据帧来捕捉这个 df 帧时,我得到的是 Nan 值。

标签: python machine-learning scikit-learn


【解决方案1】:

你可以使用Label Encoder:

from sklearn import preprocessing
le1 = preprocessing.LabelEncoder()
df['Gender'] =le1.fit_transform(df['Gender'])
le2 = preprocessing.LabelEncoder()
df['Married'] =le2.fit_transform(df['Married'])
le3 = preprocessing.LabelEncoder()
df['Education'] =le3.fit_transform(df['Education'])

这种方法将为每一列使用不同的标签编码器,这也意味着您将在不同的列中拥有相同的数字。

当您为所有标签运行一个标签编码器时,只有当它完全相同的单词时,数字才会相同。

分类后,您可以使用以下方法反转标签:

df['Married'] = le2.inverse_transform(df['Married']

【讨论】:

  • 如果一个数据集中有80列需要编码,这会花费很多时间,那么有没有其他方法可以在不影响数字列的情况下对所有数据集进行编码。
  • natheer 的解决方案会做,但你不能做逆变换
  • 逆变换有什么用?以及如何执行它。
  • 逆变换与分类本身无关,如果您想在分类后检查原始值是多少,这很有趣......代码已经写在我的答案中
  • 谢谢PV8,顺便说一下如何详细学习这些。我的意思是机器学习,因为我找不到正确的资源。
【解决方案2】:

在准备数据时,请考虑以下几点:

  1. LoanID 列是序数分类数据,需要使用一种热编码将其转换为数字,因为算法只能理解数字

  2. 标签编码器适用于二进制类,多类尝试使用一个热编码器或分解

  3. 为数字和转换后的分类数据创建单独的列,并在一个 df 中连接以进行训练和测试拆分

作为你的问题的一个例子:

#create ndarray for label encodoing (sklearn)
Gender = data.iloc[:,1:2].values
Married = data.iloc[:,2:3].values
Education = data.iloc[:,4:3].values

## le for Gender
le = LabelEncoder()
Gender[:,0] = le.fit_transform(Gender[:,0])
Gender = pd.DataFrame(Gender)
Gender.columns = ['Gender']
le_Gender_mapping = dict(zip(le.classes_, le.transform(le.classes_)))
print("Sklearn label encoder results for Gender:")  
print(le_Gender_mapping)

**Do the same for 'Married' and 'Education' as they are also binary

Load_ID = data.iloc[:,0:1].values #ndarray

## ohe for Loan_ID
ohe = OneHotEncoder() 

Load_ID = ohe.fit_transform(Loan_ID).toarray()
Load_ID = pd.DataFrame(Load_ID)
print("Sklearn one hot encoder results for Load_ID:") 

##put data together

X_num = data[['Applicant_Income']].copy()
X_final = pd.concat([Loan_ID, Gender, Married, Education, X_num], axis = 1)

This prepares your initial data set, take out column you want to predict as y_final and do the train test split.

Note: After train test split do Normalize or Standardize(preferred as less affected by outliers) otherwise the Applicant_income will dominate the predictions 

【讨论】:

  • 你已经给出了明确的信息,但我想学习深度编码我在哪里可以学习?
  • 保持基本原理清晰,明确需求和想要制作什么样的模型,仔细研究数据,记下必要的预处理步骤和特征缩放步骤。继续练习
【解决方案3】:

我更喜欢使用pd.get_dummies 方法,所以:

ohe_df = pd.get_dummies(df, columns=['Gender', 'Married', 'Education'])

【讨论】:

    【解决方案4】:

    这应该可以解决您的问题。

    from sklearn.preprocessing import LabelEncoder
    
    le = LabelEncoder()
    
    for cat_var in ['Gender', 'Married', 'Education']:
        df[cat_var] = le.fit_transform(df[cat_var])  
    

    【讨论】:

    • 最好为每个类初始化 LabelEncoder,否则您将无法执行逆变换(这在以后改进或排除模型故障时经常需要)。
    猜你喜欢
    • 2012-01-22
    • 2022-01-13
    • 2023-03-15
    • 2018-10-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多