前言
在进行模型训练时,高质量的训练数据集是决定模型性能上限的核心要素。优质数据能够帮助模型学习到更精准的语言规律、更全面的知识体系和更贴合真实场景的逻辑关系,这在之后进行模型预测的时候模特提供高质量的回复起到关键性的作用,而低质数据则可能导致模型输出错误、产生偏见甚至丧失实用价值,降低用户使用该模型的频率。因此,构建高质量训练集真的非常重要。
一、训练集获取方式
训练数据的获取需结合数据类型、应用场景及合规性要求,比较常见的方式如下面所列,其中网络爬虫是大规模获取公开数据的主流手段(ps:这也是我经常使用的手段)
其中,网络爬虫通过模拟浏览器请求,可高效抓取互联网上的公开数据,尤其适合大模型训练所需的海量文本、多模态信息;而 Bright Data 等工具凭借全球分布式 IP 网络和反爬机制规避能力,能突破地域限制与网站反爬策略,更稳定地获取高质量数据,成为构建大规模训练集的重要助力。
二、爬虫获取数据集的优势
爬虫获取数据集的优势,集中体现在对数据获取流程的优化上,能高效满足模型训练对数据的多元需求。这里我总结了几点,这些优势让爬虫成为大规模、多样化、针对性数据集构建的高效工具,尤其适配大模型训练对海量数据的需求。具体如下
这里我使用 Bright Data 来构建数据集,它提供了网页抓取 API,可以抓取 100 多个主流网站的数据,比如:X、TikTok、FaceBook、Amazon、Google 等,我们可以通过抓取 API 进行爬取数据。当然了,它还提供了 180 多种数据集,我们可以直接使用它提供的数据集,完全不用费功夫。
下面我将讲解一下如何使用 Bright Data 构建高质量训练集,并且利用这些数据集打造亚马逊电商产品 AI 推荐官。
三、Bright Data 构建高质量训练集
1、网页抓取 API 获取数据集
首先需要注册账号
注册完成之后,到达用户控制面板
选择电子商务中amazon.com
随后我们选择Amazon products - discover by keyword
来爬取数据
选择爬虫API
进行抓取,当然也可通过无代码抓取器进行爬取,然后点击下一个
随后点击API 请求构建器
输入想要搜索的产品,我这里输入的一些相机📷的产品,随后在右侧选择自己想要的脚本语言,我这里选择的是 Linux 语言的脚本,点击复制按钮复制到终端执行
随后在日志 tab 下查看脚本执行进度,Ready
说明已经执行完成,点击下载下来框中的CSV
进行下载就获取到数据集了。
2、用现成的数据集
点击左侧菜单Web Datasets
,可以看到 Bright Data 提供了一个数据集市场,真的非常震撼,种类还是非常多
比如这里我依然还是选择Amazon
,它的数据包含 75 个字段,可以探索详细的产品列表、定价、评论和销售数据。
如果你不想要某些字段,某些数据,可以过滤掉,点击下面的过滤您的数据集
添加过滤规则如下图
随后点击应用过滤
,就可以过滤掉你的数据,然后点击Proceed to purchase
去支付,就可以获取到了,当然它还提供了有免费的数据集可以使用,。
如果你对下面的数据感兴趣可以免费进行下载获取。
四、打造亚马逊电商产品 AI 推荐官
获取到上面的数据集之后,就要开始进行模型训练了,模型将自动完成数据清洗、特征工程、模型训练、评估和模型保存,最后进行模型预测,我输入价格,让模型给我提供该价格左右的产品以及产品评分。
1、模型训练
重命名上面获取到的数据集文件为amzondata.csv
,新建amzon.py
,然后安装需要依赖的库,当然前提是需要安装python环境
pip install pandas scikit-learn joblib numpy
复制代码
安装完之后,创建模型训练的代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_squared_error
import joblib
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
import numpy as np
# 1. 加载数据
data = pd.read_csv('amzondata.csv')
print("数据预览:")
print(data.head())
print("\n数据集列名:")
print(data.columns.tolist())
print("\n数据类型:")
print(data.dtypes)
# 2. 明确指定目标变量和主要特征
# 目标变量
TARGET_COL = 'final_price'
# 主要特征
MAIN_FEATURES = ['initial_price', 'rating']
# 3. 数据清洗:只要求目标变量和主要数值特征非空
clean_cols = [TARGET_COL] + MAIN_FEATURES
data_clean = data.dropna(subset=clean_cols, how='any').reset_index(drop=True)
print(f"清洗后剩余样本数: {len(data_clean)}")
if len(data_clean) == 0:
print("❌ 清洗后没有可用样本,请检查 amzondata.csv 的final_price、initial_price、rating三列是否有有效数据!")
exit(1)
X = data_clean.drop(TARGET_COL, axis=1)
y = data_clean[TARGET_COL]
# 4. 特征处理
# 自动识别文本描述列(如包含desc、描述、description等)
desc_columns = [col for col in X.columns if any(k in col.lower() for k in ['description', 'desc', '描述'])]
other_object_columns = [col for col in X.select_dtypes(include=['object']).columns if col not in desc_columns]
numeric_columns = X.select_dtypes(include=['number']).columns.tolist()
print(f"\n数值列: {numeric_columns}")
print(f"文本描述列: {desc_columns}")
print(f"其它分类型列: {other_object_columns}")
# 处理文本描述列(TF-IDF)
tfidf_vectorizers = {}
desc_features = []
if desc_columns:
for col in desc_columns:
# 检查该列是否全为空或全是空白
if X[col].dropna().astype(str).str.strip().replace('', pd.NA).dropna().empty:
print(f"列 '{col}' 全为空或无有效文本,已跳过TF-IDF处理")
continue
try:
tfidf = TfidfVectorizer(max_features=50)
desc_matrix = tfidf.fit_transform(X[col].astype(str)).toarray()
desc_feature_names = [f"{col}_tfidf_{i}" for i in range(desc_matrix.shape[1])]
desc_df = pd.DataFrame(desc_matrix, columns=desc_feature_names)
desc_features.append(desc_df)
tfidf_vectorizers[col] = tfidf
except ValueError as e:
print(f"列 '{col}' TF-IDF处理失败: {e},已跳过")
X = X.drop([col for col in desc_columns if col in X.columns], axis=1)
if desc_features:
desc_features = pd.concat(desc_features, axis=1)
else:
desc_features = pd.DataFrame()
else:
desc_features = pd.DataFrame()
# 处理其它object列(LabelEncoder)
encoders = {}
if other_object_columns:
for col in other_object_columns:
le = LabelEncoder()
X[col] = le.fit_transform(X[col].astype(str))
encoders[col] = le
# 合并所有特征
data_features = [X.reset_index(drop=True)]
if not desc_features.empty:
data_features.append(desc_features.reset_index(drop=True))
X_all = pd.concat(data_features, axis=1)
# 检查并填充缺失值
if X_all.isnull().sum().sum() > 0:
X_all = X_all.fillna(X_all.mean(numeric_only=True))
print("已填充缺失值")
# 检查样本数
if X_all.shape[0] == 0 or y.shape[0] == 0:
print("❌ 预处理后没有可用样本,请检查数据源,确保final_price、initial_price、rating三列有有效数据。")
exit(1)
# 5. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_all, y, test_size=0.2, random_state=42)
# 6. 创建并训练回归模型
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print(f'模型R2分数: {r2:.4f}')
print(f'均方误差MSE: {mse:.2f}')
results = pd.DataFrame({'实际值': y_test, '预测值': y_pred})
print("\n预测结果与实际结果对比:")
print(results.head())
# 7. 保存模型、编码器、特征名、TF-IDF向量器
joblib.dump(model, 'trained_model.pkl')
joblib.dump(encoders, 'encoders.pkl')
joblib.dump(tfidf_vectorizers, 'tfidf_vectorizers.pkl')
feature_names = X_all.columns.tolist()
joblib.dump(feature_names, 'feature_names.pkl')
print(f"已保存模型、编码器、TF-IDF向量器和特征名称: {feature_names}")
复制代码
然后执行
可以看到模型训练过程中的输出
最后将模型保存,用于后面的预测
2、模型预测
新建recommend_camera.py
文件,创建模型预测的代码,这里不需要安装新的依赖
import pandas as pd
# 1. 读取数据
data = pd.read_csv('amzondata.csv')
# 明确指定主要列名
price_col = 'final_price' # 价钱列
rating_col = 'rating' # 评分列
desc_col = 'title' # 商品名称/描述列
# 检查列是否存在
for col in [price_col, rating_col, desc_col]:
if col not in data.columns:
raise ValueError(f'未找到列: {col}')
# 去除主要列为空的行
data = data.dropna(subset=[price_col, rating_col, desc_col], how='any').reset_index(drop=True)
# 2. 用户输入价钱
try:
input_price = float(input(f"请输入你想要的相机价钱(如1000):\n"))
except Exception:
print("输入无效,请输入数字!")
exit(1)
# 3. 设定价钱区间(±10%)
price_range = 0.1
min_price = input_price * (1 - price_range)
max_price = input_price * (1 + price_range)
# 4. 筛选
filtered = data[(data[price_col] >= min_price) & (data[price_col] <= max_price)]
# 5. 输出结果
if filtered.empty:
print("没有找到该价位附近的相机。")
else:
print(f"在{min_price:.2f}~{max_price:.2f}元区间的相机:")
# 截断title为前30字符
display_df = filtered[[desc_col, price_col, rating_col]].copy()
display_df[desc_col] = display_df[desc_col].astype(str).apply(lambda x: x[:30] + '...' if len(x) > 30 else x)
print(display_df.sort_values(by=price_col).head(20).to_string(index=False))
复制代码
执行
python3 recommend_camera.py
复制代码
我输入:2000,然后 Enter,模型给我推荐了1800$~2200$
左右的相机,后来我去 Amazon 去查看,感觉给我推荐的相机还是非常不错的,这真的是省的我去对比网上各种数据,节省大量时间。
最后
通过上述步骤,我们利用 Bright Data 提供的网页抓取 API/现成的数据集获取训练数据,再到 AI 模型训练、模型预测,打造出一个亚马逊电商产品 AI 推荐官。通过输入价格,模型就可以提供该价位左右的各种品牌的产品,这一套流程可以为有兴趣的小伙伴儿利用 AI 打造个性化应用提供了一个案例,当然也可以开发其他更用去的 AI 应用!快来通过Bright Data获取你的数据集,打造你的 AI 产品吧!
评论