我正在使用Python和Scikit-Learn开发一个机器学习程序,该程序根据邮件内容将其分类到不同的问题类型中。例如:有人发邮件说“这个程序无法启动”,机器会将其归类为“崩溃问题”。
我使用的是SVM算法,该算法从两个CSV文件中读取邮件内容及其相应的分类标签。我编写了两个程序:
- 第一个程序训练机器并使用joblib.dump()导出训练模型,以便第二个程序可以使用该训练模型
- 第二个程序通过导入训练模型进行预测。我希望第二个程序能够通过使用新数据重新拟合分类器来更新训练模型,但我不知道如何实现这一点。预测程序会要求用户输入一封邮件,然后进行预测。随后,它会询问用户预测是否正确。在这两种情况下,我希望机器能从结果中学习。
训练程序:
import numpy as npimport pandas as pdfrom pandas import DataFrameimport osfrom sklearn import svmfrom sklearn import preprocessingfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.externals import joblib###### 从训练数据中的每封邮件中提取并向量化特征 ######features_file = "features.csv" #包含每封邮件描述的CSV文件。从此文本数据中提取特征features_df = pd.read_csv(features_file, encoding='ISO-8859-1') vectorizer = TfidfVectorizer()features = vectorizer.fit_transform(features_df['Description'].values.astype('U')) #CSV文件中唯一的列标记为“Description”,所以我们在这里指定###### 对训练数据的类标签进行编码 ######labels_file = "labels.csv" #包含每封邮件分类标签的CSV文件labels_df = pd.read_csv(labels_file, encoding='ISO-8859-1')lab_enc = preprocessing.LabelEncoder()labels = lab_enc.fit_transform(labels_df)###### 创建分类器并将其拟合到我们的训练数据 ######clf = svm.SVC(gamma=0.01, C=100)clf.fit(features, labels)###### 输出持久化模型文件 ######joblib.dump(clf, 'brain.pkl')joblib.dump(vectorizer, 'vectorizer.pkl')joblib.dump(lab_enc, 'lab_enc.pkl')print("训练完成。")
预测程序:
import numpy as npimport osfrom sklearn import svmfrom sklearn import preprocessingfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.externals import joblib###### 从我们的训练程序中加载模型 ######clf = joblib.load('brain.pkl')vectorizer = joblib.load('vectorizer.pkl')lab_enc = joblib.load('lab_enc.pkl')###### 提示用户输入,然后进行预测 ######print("在这里输入邮件内容,我将预测其类别")newData = [input(">> ")]newDataFeatures = vectorizer.transform(newData)print("我预测的类别是:", lab_enc.inverse_transform(clf.predict(newDataFeatures)))###### 反馈循环 - 告诉机器预测是否正确,并让它从反馈中学习 ######print("我的预测正确吗?y/n")feedback = input(">> ")inputValid = Falsewhile inputValid == False: if feedback == "y" or feedback == "n": inputValid = True else: print("无法理解的响应。预测正确吗?y/n") feedback = input(">> ")if feedback == "y": print("我预测正确了。我将把这些新数据纳入我的持久化模型,以帮助未来预测。") #使用新特征和标签重新拟合分类器elif feedback == "n": print("我预测错误了。正确的类别是什么?") correctAnswer = input(">> ") print("明白了。我将把这些新数据纳入我的持久化模型,以帮助未来预测。") #使用新特征和标签重新拟合分类器
根据我所阅读的内容,我了解到SVM并不真正支持增量学习,所以我认为我需要将新数据合并到旧的训练数据中,并且每次有新数据添加时都需要从头开始重新训练整个模型。这没问题,但我不知道如何实际实现它。我需要预测程序更新两个CSV文件以包含新数据,以便重新开始训练吗?
回答:
我最终弄清楚了我的问题的概念性答案是,我需要更新最初用于训练机器的CSV文件。在收到反馈后,我只需将新的特征和标签写入各自的CSV文件,然后可以使用包含在训练数据集中的新信息重新训练机器。