Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 您必须为顺序变量创建虚拟变量吗?转换时也会出现错误_Python_Pandas_Machine Learning - Fatal编程技术网

Python 您必须为顺序变量创建虚拟变量吗?转换时也会出现错误

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

对于我正在使用的数据集,分类变量是有序的,三列的范围从1到5。我将把这个输入XGBoost

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

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]