基于单字符串列的变量分类方法咨询(含SVM疑问及示例数据)
基于字符串列用SVM实现分类的实操指南
针对你的需求——用产品名称(names列)预测类别(category列),我来一步步带你实现,全是可直接跑的代码和易懂的解释~
第一步:准备环境与加载数据
首先确保你安装了必要的库:pandas用于数据处理,scikit-learn用于特征提取和模型构建。如果没装,直接用pip install pandas scikit-learn搞定。
先把你的示例数据加载成DataFrame:
import pandas as pd # 你的示例数据 data = [ ["321 Friall Táborské krokety 750g", "美式土豆与薯条"], ["800 McCain Fri'Style 600g", "美式土豆与薯条"], ["803 McCain Smiles 450g", "美式土豆与薯条"], ["935 Nowaco Americké brambory 750g", "美式土豆与薯条"], ["937 Nowaco Krokety 300g", "美式土豆与薯条"], ["1375 Tesco Kořeněné bramborové dílky 750g", "美式土豆与薯条"], ["939 Nowaco Pstruh lososovitý filet", "包装鱼类"], ["1157 Rybářství Chlumec Nad Cidlinou Kapr půlka s kůží čerstvá chlazená", "包装鱼类"], ["1158 Rybářství Chlumec Nad Cidlinou Kapr řízky s kůží čerstvě chlazené", "包装鱼类"], ["1159 Rybářství Chlumec Nad Cidlinou Pstruh kuchaný s hlavou čerstvý chlazený", "包装鱼类"], ["322 Gastro Camping salát 140g", "包装沙拉"], ["323 Gastro Ďábelský salát 140g", "包装沙拉"], ["324 Gastro Feferonový salát 140g", "包装沙拉"], ["325 Gastro Hermelínový salát 140g", "包装沙拉"], ["326 Gastro Holandský salát 140g", "包装沙拉"], ["327 Gastro Loupežnický salát 140g", "包装沙拉"] ] df = pd.DataFrame(data, columns=["names", "category"])
第二步:文本特征提取——把字符串转成数值向量
SVM是数值模型,没法直接处理文本,所以咱们用TF-IDF把产品名称转换成数值特征。TF-IDF能帮我们衡量每个词汇在文本中的重要性,比如“salát”(沙拉)在沙拉类名称里出现频繁,权重就高,很适合分类。
from sklearn.feature_extraction.text import TfidfVectorizer # 初始化TF-IDF转换器,这里可以根据需求调整参数,比如去掉停用词(如果你的语言有现成停用词库的话) tfidf = TfidfVectorizer(stop_words=None) # 因为你的数据是捷克语+中文,暂时不用停用词,后续可以优化 X = tfidf.fit_transform(df["names"]) # 把names列转成TF-IDF矩阵 y = df["category"] # 目标类别
第三步:拆分训练集与测试集
为了评估模型效果,咱们把数据分成训练集(用来训练模型)和测试集(用来验证模型):
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
第四步:构建并训练SVM模型
文本分类里,线性核SVM通常效果不错,而且速度快,适合你的场景。咱们用scikit-learn的SVC类来实现:
from sklearn.svm import SVC # 初始化线性核SVM分类器 svm_classifier = SVC(kernel='linear') # 用训练集训练模型 svm_classifier.fit(X_train, y_train)
第五步:模型评估与预测
训练完之后,咱们看看模型在测试集上的表现,比如准确率,也可以用混淆矩阵看分类细节:
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # 用测试集预测 y_pred = svm_classifier.predict(X_test) # 输出准确率 print(f"模型准确率:{accuracy_score(y_test, y_pred):.2f}") # 输出分类报告(包含精确率、召回率、F1值) print("\n分类报告:") print(classification_report(y_test, y_pred)) # 输出混淆矩阵 print("\n混淆矩阵:") print(confusion_matrix(y_test, y_pred))
第六步:用模型预测新数据
如果有新的产品名称,咱们可以这样预测它的类别:
# 示例新数据 new_names = ["Tesco Krokety 500g", "Greek Salát 200g", "Rybářství Kapr filet"] # 转成TF-IDF特征(注意用transform,不是fit_transform,避免数据泄露) new_X = tfidf.transform(new_names) # 预测类别 predictions = svm_classifier.predict(new_X) for name, pred in zip(new_names, predictions): print(f"产品名称:{name} → 预测类别:{pred}")
一些优化建议
- 停用词处理:如果你的数据里有很多无意义的词汇(比如数字、单位“g”),可以自定义停用词列表,在
TfidfVectorizer里设置stop_words参数,过滤掉这些干扰项。 - 核函数选择:如果线性核效果不够好,可以试试RBF核(
kernel='rbf'),但要注意调参(比如C和gamma)。 - 数据增强:如果你的数据集很小,可以考虑同义词替换、拼写修正等方式扩充数据,提升模型泛化能力。
内容的提问来源于stack exchange,提问作者Patrik Bachan
相关产品推荐
相关产品推荐

