对于有序变量,是否必须创建虚拟变量?转换时也遇到了错误

我正在处理的数据集中,分类变量是有序的,三个列的值从1到5。我打算将这些数据输入到XGBoost模型中。

我可以直接运行以下命令并跳过创建虚拟变量吗:

ser = pd.Series([1, 2, 3], dtype='category')ser = ser.to_frame()ser = ser.T

从概念上讲,既然分类数据是有序的,仅将其转换为类别类型是否就足够了?我尝试过创建虚拟变量,但所有值都变成了1。

至于现在的代码,它可以运行,但这个命令返回了’numpy.int64’。

type(ser[0][0])

我这样做对吗?任何帮助都将不胜感激!

编辑:更新了代码

编辑2:对数值数据进行标准化。这种逻辑正确吗?

r = [1, 2, 3, 100 ,200]scaler = preprocessing.StandardScaler()r = preprocessing.scale(r)r = pd.Series(r)r = r.to_frame()r = r.T

编辑3:这是数据集


回答:

仅仅将分类变量设置为dtype="category"是不够的,也不会起作用。

你需要使用pd.factorize()将分类值转换为真正的分类值,每个类别被分配一个数值标签。

假设df是你的pandas数据框。那么一般来说,你可以使用以下模板代码:

df_numeric = df.select_dtypes(exclude=['object'])df_obj = df.select_dtypes(include=['object']).copy()# 对分类列进行因子化for c in df_obj:     df_obj[c] = pd.factorize(df_obj[c])[0]# 如果你想进行独热编码,则添加以下行:df_obj = pd.get_dummies(df_obj, prefix_sep='_', drop_first = True)# 将数据框合并回一个df_final = pd.concat([df_numeric, df_obj], axis=1)

由于你的分类变量已经是因子化的(据我理解),你可以跳过因子化步骤,直接尝试独热编码。

另见stats.stackexchange上的这篇文章

如果你想对你的数值数据(不是分类数据)进行标准化/归一化,请使用以下函数:

from sklearn import preprocessingdef scale_data(data, scale="robust"):    x = data.values         if scale == "minmax":        scaler = preprocessing.MinMaxScaler()        x_scaled = scaler.fit_transform(x)    elif scale == "standard":        scaler = preprocessing.StandardScaler()        x_scaled = scaler.fit_transform(x)    elif scale == "quantile":        scaler = preprocessing.QuantileTransformer()        x_scaled = scaler.fit_transform(x)          elif scale == "robust":        scaler = preprocessing.RobustScaler()        x_scaled = scaler.fit_transform(x)      data = pd.DataFrame(x_scaled, columns = data.columns)     return datascaled_df = scale_data(df_numeric, "robust")

将所有这些整合起来,针对你的数据集

from sklearn import preprocessingdf = pd.read_excel("default of credit card clients.xls", skiprows=1)y = df['default payment next month'] #目标变量del df['default payment next month']c = [2,3,4] # 分类数据列的索引r = list(range(0,24)) r = [x for x in r if x not in c] # 获取所有其他列的列表df_cat = df.iloc[:, [2,3,4]].copy()df_con = df.iloc[:, r].copy()# 对分类数据进行因子化for c in df_cat:     df_cat[c] = pd.factorize(df_cat[c])[0]# 对连续数据进行缩放scaler = preprocessing.MinMaxScaler()df_scaled = scaler.fit_transform(df_con)df_scaled = pd.DataFrame(df_scaled, columns=df_con.columns)df_final = pd.concat([df_cat, df_scaled], axis=1)#将列重新排序回原始顺序cols = df.columnsdf_final = df_final[cols]

为了进一步改进代码,请在归一化之前进行训练/测试数据分割,对训练数据使用fit_transform(),对测试数据仅使用transform()。否则会导致数据泄露。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注