一. 理解数据
1、导入数据
train_df = pd.read_csv(config['train_path'],sep=' ')
test_df = pd.read_csv(config['test_path'],sep=' ')
df = pd.concat([train_df,test_df],axis=0).reset_index(drop=True)
2、分析数据
1)power:发动机功率:范围 [ 0, 600 ]
#将超出范围的处理为600
df.loc[df['power']>600,'power'] = 600
2)处理nan值
df[col] = df[col].fillna('-1')
3)连续特征标准化
#连续特征
for col in config['num_cols']:
df[col] = df[col].fillna(0)
df[col] = (df[col]-df[col].min()) / (df[col].max()-df[col].min())
4)较大的值进行log变换
train_df['price'] = np.log(train_df['price'])
5)绘制密度图、频次图等
# 离散特征
for col in config['cate_cols']:
# 统计特征频次
counts = df[col].value_counts()
# 绘制条形图
counts.plot(kind='bar')
# 设置图形标题和标签
plt.title(f'{
col} Frequencies')
plt.xlabel(col)
plt.ylabel('Frequency')
# 显示图形
plt.show()
3、批量读取数据
注意事项:
- 理解数据原始形式,比如,数据是有什么分隔的,数据的字段类型等
- 理解数据编码方式,比如连续还是离散。
- 理解数据字段,比如哪些是特征列,哪些是预测列
- 理解如何进行数据IO
#Dataset构造,继承dataset
class SaleDataset(Dataset):
def __init__(self,df,cate_cols,num_cols):
self.df = df
self.feature_name = cate_cols + num_cols
def __getitem__(self, index):
data = dict()
### 特征列处理
for col in self.feature_name:
data[col] = torch.Tensor([self.df[col].iloc[index]]).squeeze(-1)
### 预测列
if 'price' in self.df.columns:
data['price'] = torch.Tensor([self.df['price'].iloc[index]]).squeeze(-1)
return data
def __len__(self):
return len(self.df)
def get_dataloader(df, cate_cols ,num_cols, batch_size=256, num_workers=2, shuffle=True):
dataset = SaleDataset(df,cate_cols,num_cols)
dataloader = D.DataLoader(dataset, batch_size=batch_size, shuffle=shuffle, num_workers=num_workers)
return dataloader
4、定义模型
可以将模型拆解为各个子模块,单独定义,最后整合
- embedding层,对离散特征进行处理
# Embedding层:用于对离散特征进行编码映射
class EmbeddingLayer(nn.Module):
def __init__(self,
vocab_map = None,
embedding_dim = None):
super(EmbeddingLayer, self).__init__