机器学习实践项目(三)- Mercari二手商店价格预测 - 数据预处理

Mercari价格预测数据预处理

1. 预处理核心代码

# ========== 1) 预处理 ==========
def prepare_mercari_basic(df: pd.DataFrame,
                          category_col: str = "category_name",
                          brand_fill: str = "No Brand",
                          desc_fill: str = "No description",
                          cat_fill: str = "Unknown",
                          keep_original_category: bool = True) -> pd.DataFrame:
    """
    1) 填充 brand_name / item_description
    2) 安全拆分 category_name -> cat1/cat2/cat3(兼容缺失/层级不全/过多)
    """
    df = df.copy()

    if "brand_name" in df.columns:
        df["brand_name"] = df["brand_name"].fillna(brand_fill)

    if "item_description" in df.columns:
        df["item_description"] = df["item_description"].fillna(desc_fill)

    if category_col in df.columns:
        cats = (
            df[category_col]
            .fillna("")
            .str.extract(r"([^/]*)(?:/([^/]*))?(?:/(.*))?")
            .rename(columns={0: "cat1", 1: "cat2", 2: "cat3"})
        )
        cats = cats.replace("", np.nan).fillna(cat_fill)

        if not keep_original_category:
            df = df.drop(columns=[category_col])

        df = pd.concat([df, cats], axis=1)

    return df

def shrink_brands_for_ohe(df: pd.DataFrame, col: str = "brand_name", top_n: int = 4000) -> pd.DataFrame:
    """保留高频品牌,其余归为 'Other',降低 OHE 维度"""
    df = df.copy()
    if col not in df.columns:
        return df
    top = df[col].value_counts().nlargest(top_n).index
    df[col] = np.where(df[col].isin(top), df[col], "Other")
    return df

以上代码主要是完成对数据集的缺失值补全以及类别的分拆,下面我们来一一分析。


2. 缺失值补齐

按照前文的分析,缺失值主要体现在品牌(brand_name)字段和商品描述字段(item_description),我们补齐的策略是“老老实实”补一个“不知道”,也即品牌补充“No Brand”,商品描述补充“No Description”。

    if "brand_name" in df.columns:
        df["brand_name"] = df["brand_name"].fillna(brand_fill) # No Brand

    if "item_description" in df.columns:
        df["item_description"] = df["item_description"].fillna(desc_fill) # No Description

3. 类别的处理

原始的类别字段的格式为:

Cat 1/Cat 2/Cat3

而且,而且是不规则的。。。这个是最坑人的地方,有可能是这样:

Cat 1/Cat 2

有可能又是这样:

Cat 1/Cat 2/Cat 3/Cat 4

那鬼知道它会有几个层级,所以,我们简单处理,只抽3层,代码如下:

    if category_col in df.columns:
        cats = (
            df[category_col]
            .fillna("")
            .str.extract(r"([^/]*)(?:/([^/]*))?(?:/(.*))?")
            .rename(columns={0: "cat1", 1: "cat2", 2: "cat3"})
        )
        cats = cats.replace("", np.nan).fillna(cat_fill)

上面的代码,先把空值填充空字符串;然后用正则表达式截三段,如果多余三段,则第三段及后面的内容都当成第三段处理;然后字段名重命名为“cat1”、“cat2”、“cat3”。

4. 品牌收缩

这个其实是个简单的概念,因为Mercari是个通用的二手交易平台,什么都卖(你想想国内的闲鱼),所以品牌字段多如牛毛,但是总会有高频的品牌和低频的品牌,品牌数量太多的话后续进行独热编码处理时,维度会过多,因此,需要划一条线,对Top N以下频率的统统归为Other.


经过以上的操作,我们的数据预处理结束了,很简单的一个步骤,这个数据集的字段本来就不多,我们下一篇文章就进入核心操作:特征工程。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值