gpt4 book ai didi

python - 是否必须为序数变量创建虚拟变量?转换时也出现错误

转载 作者:行者123 更新时间:2023-11-30 08:58:06 26 4
gpt4 key购买 nike

对于我正在使用的数据集,分类变量是有序的,三列范围从 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])

我的做法正确吗?任何帮助都会很棒!

编辑:更新代码

Edit2:标准化数值数据值。这个逻辑正确吗?:

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:This is the dataset .

最佳答案

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

您需要使用 pd.factorize() 将分类值转换为真实的分类值,其中每个类别都分配有一个数字标签。

假设 df 是您的 pandas 数据框。那么一般来说你可以使用这个样板代码:

df_numeric = df.select_dtypes(exclude=['object'])
df_obj = df.select_dtypes(include=['object']).copy()

# factorize categoricals columnwise
for c in df_obj:
df_obj[c] = pd.factorize(df_obj[c])[0]

# if you want to one hot encode then add this line:
df_obj = pd.get_dummies(df_obj, prefix_sep='_', drop_first = True)

# merge dataframes back to one dataframe
df_final = pd.concat([df_numeric, df_obj], axis=1)

由于您的分类变量已经被分解(据我所知),您可以跳过分解并只尝试一种热编码。

另请参阅this post on stats.stackexchange .

如果您想标准化/归一化您的数值数据(而不是分类数据),请使用此函数:

from sklearn import preprocessing

def 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 data

scaled_df = scale_data(df_numeric, "robust")

把它们放在一起for your dataset :

from sklearn import preprocessing

df = pd.read_excel("default of credit card clients.xls", skiprows=1)

y = df['default payment next month'] #target variable
del df['default payment next month']

c = [2,3,4] # index of categorical data columns
r = list(range(0,24))
r = [x for x in r if x not in c] # get list of all other columns
df_cat = df.iloc[:, [2,3,4]].copy()
df_con = df.iloc[:, r].copy()

# factorize categorical data
for c in df_cat:
df_cat[c] = pd.factorize(df_cat[c])[0]

# scale continuous data
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)

#reorder columns back to original order
cols = df.columns
df_final = df_final[cols]

要进一步改进代码,请在标准化之前进行训练/测试拆分,对训练数据进行 fit_transform() 操作,而仅对测试数据进行 transform() 操作。否则你将会发生数据泄露。

关于python - 是否必须为序数变量创建虚拟变量?转换时也出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51484970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com