Advertisement

Sklearn 机器学习 特征提取 字符串清理转数字

阅读量:

💖广大技术爱好者们,请您诚挚地欢迎您来到 Kant2048 博客!我是 Thomas Kant,请问这是您第一次访问吗?很高兴向大家介绍自己,在平台与众多技术 enthusiasts 一同成长!

在这里插入图片描述

自动化测试

关键词

自动化的测试方案


在这里插入图片描述

Sklearn 机器学习:特征提取中的字符串清理与数字转换

在机器学习建模过程中,默认情况下会遇到混合格式的数据问题,尤其是在涉及 字符串与数字结合 的文本特征(例如,“¥123元”、“高(3.2分)”、“约50%”等)的情况下,如果不进行适当的清理和转换处理,数据在模型中难以有效应用

本文旨在带你深入探索如何利用 Sklearn + Pandas 这些工具从原始数据字符串中提取数值特征从而有助于提升机器学习模型的性能。


📌 一、应用场景举例

在实际项目中,以下场景非常常见:

  • 电商价格信息字段:例如 `123.00 元或 ¥89 元。
  • 商品评分数据字段:例如 "评分为4.5分" 或 "评分为高分(3.2分)"。
  • 折扣比例或优惠百分比信息:例如 "约有50%的折扣率" 或 "提供大约30%的优惠力度"。
  • 地理位置或温度数据字段:例如 "地理位置在东经120度附近" 或 "温度为22℃左右"。

这些特征的主要特性在于它们都包含有无用符号、单位以及前后缀。需要经过去除非必要的附加信息并转换为纯数值处理才能用于模型。


🔧 二、字符串转数值的常见方法

我们以 Pandas 的 Series 为例,介绍几种典型的字符串清理技巧。

2.1 正则表达式提取数字

复制代码
    import pandas as pd
    
    s = pd.Series(["¥123.45", "89元", "100", "¥56.7"])
    s_clean = s.str.extract(r"(\d+\.?\d*)")[0].astype(float)
    
    print(s_clean)
    
    
    python

输出:

复制代码
    0    123.45
    1     89.00
    2    100.00
    3     56.70
    dtype: float64

说明:

  • 该表达式用于提取整数或带有可选小数部分的数值;
    • str.extract() 实现正则表达式提取,并返回其结果为 DataFrames结构;为了获取所需列的数据,请使用 [0] 层索引。

2.2 去除单位、符号再转换

复制代码
    s = pd.Series(["4.5分", "3.2分", "5.0", "4分"])
    s_clean = s.str.replace("分", "", regex=False).astype(float)
    
    print(s_clean)
    
    
    python

2.3 处理百分比转小数

复制代码
    s = pd.Series(["50%", "20%", "75.5%"])
    s_clean = s.str.replace("%", "", regex=False).astype(float) / 100
    
    print(s_clean)
    
    
    python

输出:

复制代码
    0    0.500
    1    0.200
    2    0.755
    dtype: float64

🧱 三、集成进 Sklearn Pipeline 中

建议采用将字符串预处理流程构建为自定义 Transformer,并通过 Sklearn 的 Pipeline 实现自动化处理。

3.1 自定义字符串清理类

复制代码
    from sklearn.base import BaseEstimator, TransformerMixin
    import pandas as pd
    
    class StringToFloatExtractor(BaseEstimator, TransformerMixin):
    def __init__(self, pattern=r"(\d+\.?\d*)", divide_by_100=False):
        self.pattern = pattern
        self.divide_by_100 = divide_by_100
    
    def fit(self, X, y=None):
        return self
    
    def transform(self, X):
        X_cleaned = X.copy()
        for col in X_cleaned.columns:
            X_cleaned[col] = (
                X_cleaned[col]
                .astype(str)
                .str.extract(self.pattern)[0]
                .astype(float)
            )
            if self.divide_by_100:
                X_cleaned[col] /= 100
        return X_cleaned
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/1EmhWvaQgR2bYTIyi4wZJKPeB0Du.png)

3.2 使用 Pipeline 清洗百分比字段

复制代码
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    
    df = pd.DataFrame({
    "discount": ["30%", "50%", "75%", "20%"]
    })
    
    pipeline = Pipeline(steps=[
    ("extractor", StringToFloatExtractor(divide_by_100=True)),
    ("scaler", StandardScaler())
    ])
    
    result = pipeline.fit_transform(df)
    print(result)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/KJYlILeTNOxrbRnF3GA65d12ZyWV.png)

🧠 四、实战建议与注意事项

  • 字符串清洗应提前在 特征工程这一步骤 完成;
  • 若字段中存在多个数值(例如 "高3.2/低2.5"),则需开发专门的提取机制;
  • 为确保一致性,在处理前需将所有单位统一;
  • 当使用.str.extract()无法匹配时会返回NaN值,必须与缺失值处理流程相结合。

总结

在数据预处理阶段中存在一种特殊的字段类型——非数值类型的字段,在该领域中通常被称为"隐性数值特征"。本文主要介绍了几种常见的清洗方法:具体包括删除缺失值、填充空缺值以及归一化处理等。

  • 通过正则表达式提取数值;
  • 删除带有单位的字符;
  • 将百分比转换为小数形式;
  • 基于模块化设计实现Sklearn中的Transformer。

这些技巧可以提升模型特征质量,为后续建模打下坚实基础。


✨如果你认为这篇文章对你有所帮助,请在文章底部点👍、收藏⭐并关注我✨。也欢迎在评论区留言交流!

全部评论 (0)

还没有任何评论哟~