如何将Object类型列转换为PyTorch Tensor?现有方案是否可行?
问题
我是机器学习与Python新手,正在处理包含2列Object类型及大量Float类型列的数据。将Float类型列转换为Tensor的代码可正常运行:
cont_cols = ['row_id', 'player1','player2','playervar_0','player_1'] conts = np.stack([train_df[col].values for col in cont_cols],1) conts = torch.tensor(conts,dtype= torch.float)
但转换Object类型列时执行以下代码触发报错:
obj_cols = ['winner','team'] objs = np.stack([train_df[col].values for col in obj_cols],1) objs = torch.tensor(objs, dtype= torch.float)
报错信息:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[60], line 2 1 objs = np.stack([train_df[col].values for col in obj_cols],1) ----> 2 objs = torch.tensor(objs, dtype= torch.float) TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.
补充说明:winner列取值为winner、loser、draw,team列取值为team1、team2。我尝试通过映射将类别转为数值后成功转换:
train_df['winner'] = train_df['winner'].map({'loser': 0, 'winner': 1, 'draw': 2}) train_df['team'] = train_df['team'].map({'team1': 0, 'team2': 1}) obj_cols = ['winner','team'] objs = np.stack([train_df[col].values.tolist() for col in obj_cols],1) objs = torch.tensor(objs, dtype= torch.float) objs[:5] # 输出: # tensor([[1., 0.], # [0., 1.], # [0., 0.], # [0., 1.], # [2., 0.]])
请问该方法是否可行?是否有更优的处理方案?
回答
你的方法完全可行
手动映射类别到数值的方式是处理类别型数据的基础方案之一,逻辑清晰,尤其适合类别取值明确、数量较少的场景(比如你这里的2类、3类特征),转换后的数据可正常转为PyTorch Tensor,满足后续模型输入要求。
更优处理方案
针对类别型数据的转换,有几种更高效、规范的方式:
- 使用
sklearn.preprocessing.LabelEncoder自动编码
无需手动编写映射字典,适合类别数量较多的场景,能自动将字符串类别映射为连续整数:
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() # 对每个类别列逐一编码 for col in obj_cols: train_df[col] = le.fit_transform(train_df[col]) # 转换为Tensor:建议用torch.long类型(适配后续Embedding层输入) objs = torch.tensor(train_df[obj_cols].values, dtype=torch.long)
若需保留类别与数值的对应关系,可通过
le.classes_查看原始类别列表,列表索引即为对应的编码值。
- 使用Pandas原生类别类型转换
利用Pandas的category类型直接提取编码,操作更简洁:
# 将Object列转为category类型 train_df['winner'] = train_df['winner'].astype('category') train_df['team'] = train_df['team'].astype('category') # 提取编码并转为Tensor objs = torch.tensor( np.stack([train_df[col].cat.codes.values for col in obj_cols], axis=1), dtype=torch.long )
- 模型适配优化建议
如果后续需要对类别特征做嵌入(Embedding)处理,务必将Tensor类型设为torch.long而非torch.float——PyTorch的Embedding层要求输入为整数类型的索引,这样能避免不必要的类型转换开销,提升模型运行效率。
内容的提问来源于stack exchange,提问作者sarika
相关产品推荐
相关产品推荐

