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

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在优快云上与你们相遇~💖

在这里插入图片描述

本博客的精华专栏:
【自动化测试】 【测试经验】 【人工智能】 【Python】


在这里插入图片描述

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

在机器学习建模过程中,我们经常会遇到混合格式的数据,尤其是包含 字符串+数字 的文本特征(如“¥123元”、“高(3.2分)”、“约50%”等),若不进行合理清洗与转换,将无法被模型有效利用。

本文将带你深入了解如何使用 Sklearn + Pandas 等工具,从原始字符串中提取数值特征,助力机器学习模型性能提升!


📌 一、应用场景举例

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

  • 电商价格字段:如 "¥123.00""¥89元"
  • 商品评分字段:如 "评分4.5分""高(3.2分)"
  • 折扣/百分比信息:如 "约50%""优惠30%"
  • 地理/温度类信息:如 "22℃""东经120度"

这些特征的共同点是:带有无用符号、单位、前后缀,需清洗后转为数值,才能用于模型。


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

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

2.1 正则表达式提取数字

import pandas as pd

s = pd.Series(["¥123.45", "89元", "100", "¥56.7"])
s_clean = s.str.extract
### 实现两位数手写数字识别的机器学习代码 对于两位数的手写数字识别问题,可以通过扩展经典的 MNIST 数据集方法来解决。MNIST 是一个单个手写数字的数据集 (0 到 9),而两位数的情况则需要处理组合形式的图像或序列化输入。 以下是基于 K-近邻算法 (KNN) 和支持向量机 (SVM) 的两种实现方式: #### 方法一:使用 K-近邻算法 (KNN) ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split import numpy as np # 假设我们有一个自定义数据集 `two_digit_dataset`,形状为 (n_samples, height * width) def load_two_digit_data(): # 加载两位数手写数字数据集 X = np.random.rand(1000, 784) # 示例数据,实际应替换为真实数据 y = ["{}{}".format(i // 10, i % 10) for i in range(100)] # 标签为字符串表示的两位数 return X, y X, y = load_two_digit_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) accuracy = knn.score(X_test, y_test) print(f"Accuracy on two-digit dataset using KNN: {accuracy:.2f}") ``` 此代码片段展示了如何加载两位数手写数字数据并应用 KNN 进行分类[^2]。注意,这里假设标签是以字符串形式存储的两位数组合(如 `"12"` 表示数字 1 和 2 组成的两位数)。 --- #### 方法二:使用卷积神经网络 (CNN) 卷积神经网络更适合处理复杂的图像模式,尤其是当两位数由单独的子图组成时。 ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 构建 CNN 模型 model = Sequential([ Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), Conv2D(64, kernel_size=(3, 3), activation='relu'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(128, activation='relu'), Dense(100, activation='softmax') # 输出层对应 100 种可能的两位数类别 ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 假设我们已经准备好训练和测试数据 X_train_cnn = X_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0 y_train_cnn = np.array([int(label) for label in y_train]) # 将标签换为整数索引 X_test_cnn = X_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0 y_test_cnn = np.array([int(label) for label in y_test]) model.fit(X_train_cnn, y_train_cnn, epochs=10, batch_size=32, validation_data=(X_test_cnn, y_test_cnn)) test_loss, test_accuracy = model.evaluate(X_test_cnn, y_test_cnn) print(f"CNN Test Accuracy: {test_accuracy:.2f}") ``` 在这个例子中,模型的最后一层具有 100 个单元,分别代表从 0 到 99 的所有可能两位数值。通过 softmax 函数计算概率分布,从而预测最有可能的两位数。 --- ### 处理异常值的影响 在构建模型之前,建议对数据进行预处理以减少噪声干扰。例如,在标注过程中可能存在人为错误导致的异常值,这些异常值会显著影响模型性能[^3]。可以采用如下策略清理数据: 1. **统计分析**:移除超出合理范围的样本。 2. **可视化检查**:手动审查可疑样本。 3. **鲁棒特征提取**:利用不变性较强的特征降低敏感度。 --- ### 控制过拟合的风险 为了避免模型过度拟合训练数据,可引入正则化技术或调整超参数。例如,在决策树场景下设置最大深度 (`max_depth`) 或最小分裂条件 (`minsplit`) 来约束复杂度[^4]。同样适用于其他类型的模型配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas Kant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值