Python 您必须为顺序变量创建虚拟变量吗?转换时也会出现错误
对于我正在使用的数据集,分类变量是有序的,三列的范围从1到5。我将把这个输入XGBoost 我可以运行此命令并跳过创建虚拟变量吗:Python 您必须为顺序变量创建虚拟变量吗?转换时也会出现错误,python,pandas,machine-learning,Python,Pandas,Machine Learning,对于我正在使用的数据集,分类变量是有序的,三列的范围从1到5。我将把这个输入XGBoost 我可以运行此命令并跳过创建虚拟变量吗: ser = pd.Series([1, 2, 3], dtype='category') ser = ser.to_frame() ser = ser.T 我想从概念上知道,既然分类数据是有序的,那么简单地将其转换为类型category对模型来说是否足够?我尝试创建虚拟变量,但所有的值都变成了1 至于现在的代码,它会运行,但是这个命令返回:“numpy.int64
ser = pd.Series([1, 2, 3], dtype='category')
ser = ser.to_frame()
ser = ser.T
我想从概念上知道,既然分类数据是有序的,那么简单地将其转换为类型category对模型来说是否足够?我尝试创建虚拟变量,但所有的值都变成了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
Edit3:.仅将分类变量设置为
dtype=“category”
是不够的,也不起作用
您需要使用pd.factorize()
将分类值转换为真正的分类值,其中每个类别都分配了一个数字标签
假设df
是您的数据帧。一般来说,您可以使用以下样板代码:
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)
因为你的分类变量已经被分解了(据我所知),你可以跳过分解,只需尝试一种热编码
另见
如果要标准化/规范化数值数据(而非分类数据),请使用此功能:
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")
总而言之:
为了进一步改进代码,在标准化之前进行训练/测试拆分,对训练数据进行
fit_transform()
,对测试数据进行transform()
。否则,您将发生数据泄漏 谢谢你的回复。请让我知道我是否正确理解这一点。您将数据帧拆分为两个数据帧,一个包含连续数据,另一个包含分类数据。对于分类数据,您正在分解它。然后将其附加到数字数据帧。我也在标准化数值数据。我该怎么做呢?我将在下一次编辑中包含此内容。谢谢,我理解分类部分。谈到规范化,您能否解释一下您提供的代码的逻辑?此外,当运行所有代码时,我将得到以下格式的行:[数值,cat,cat,cat,数值,数值…]。整行中只有三个分类变量。有没有一种方法可以简单地索引哪些行需要规范化,哪些行需要分解?我最好不要把他们分开。好吧,我想我理解你。所以我可以使用任何预处理执行规范化,然后简单地将其合并回来?它们每次合并的顺序是否相同(例如:索引)?最后一个问题:我想用模型预测的数据正好是包含所有特征的一行。我想进行因式分解、标准化,并且必须以与我训练/测试时完全相同的格式重新合并。合并的顺序索引是否与我过去合并时相同(是否会更新测试/训练代码以反映这一点)?我觉得如果合并的顺序发生变化(与我训练/测试的时间以及我尝试和预测的时间有关),将对我的模型性能产生负面影响?只是想确保。
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]