#### 任务四:使用TFIDF特征和线性模型完成训练和预测
- 说明:在这个任务中,你需要使用TFIDF特征和线性模型(如逻辑回归)完成训练和预测,通过机器学习算法来区分人类编写的文本和机器生成的文本。
- 实践步骤:
- 准备TFIDF特征矩阵和相应的标签。
- 划分训练集和验证集集。
- 使用Sklearn中的线性模型(如逻辑回归)进行训练,并使用训练好的模型对验证集集进行预测。
- 评估模型的性能,如准确率、精确率、召回率等指标。
- 选择得到合适的模型,对测试集进行预测,并提高到比赛页面2023 iFLYTEK A.I.开发者大赛-讯飞开放平台
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
train_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/train.csv')
test_data = pd.read_csv('./ChatGPT生成文本检测器公开数据-更新/test.csv')
# 对输入的内容进行处理
train_data['content'] = train_data['content'].apply(lambda x: x[1:-1].strip().replace('\n', ' \n '))
test_data['content'] = test_data['content'].apply(lambda x: x[1:-1].strip().replace('\n', ' \n '))
train_data['content'] = train_data['content'].apply(lambda x: x.split(' '))
test_data['content'] = test_data['content'].apply(lambda x: x.split(' '))
train_data['content'] = train_data['content'].apply(lambda x: [i for i in x if i != ''])
test_data['content'] = test_data['content'].apply(lambda x: [i for i in x if i != ''])
tfidf = TfidfVectorizer()
tfidf.fit(train_data['content'].apply(lambda x: ' '.join(x)))
train_tfidf_feat = tfidf.transform(train_data['content'].apply(lambda x: ' '.join(x)))
test_tfidf_feat = tfidf.transform(test_data['content'].apply(lambda x: ' '.join(x)))
# 使用cross_val_predict()函数进行交叉验证
val_pred = cross_val_predict(
LogisticRegression(),
train_tfidf_feat,
train_data['label']
)
# 计算并输出分类报告
print(classification_report(train_data['label'], val_pred, digits=3))
precision recall f1-score support
0 0.981 0.999 0.990 11836
1 0.992 0.892 0.940 2164
accuracy 0.982 14000
macro avg 0.986 0.946 0.965 14000
weighted avg 0.982 0.982 0.982 14000
在这个场景中使用交叉验证的目的是为了更准确地评估模型的性能和泛化能力。交叉验证是一种评估机器学习模型的统计方法,通过将数据集划分为多个子集,在不同的训练和验证集上多次训练和评估模型,以得到更可靠的性能指标。
如果你想要提高模型的精度,可以尝试调整TfidfVectorizer
的一些超参数。以下是一些常用的超参数,你可以根据实际情况进行调整:
1.ngram_range
:n元语法范围。通过将ngram_range
设置为大于1的值,可以考虑多个连续的词作为特征,从而捕捉更多的语义信息。例如,将ngram_range
设置为(1, 2)可以同时考虑单个词和相邻的词作为特征。
tfidf = TfidfVectorizer(ngram_range=(1,2), max_features=5000)
2.max_df
和min_df
:单词的最大和最小文档频率。通过调整max_df
和min_df
的值,可以过滤掉在太多或太少文档中出现的单词,从而减少噪声和特异性单词的影响。
修改max_df和min_df
3.
max_features
:最大特征数。通过限制特征的数量,可以减少特征空间的维度,从而减少模型的复杂性和计算量。
4.stop_words
:停用词列表。通过设置适当的停用词列表,可以去除常见的、对分类任务没有帮助的词语,从而减少噪声。
5.sublinear_tf
:子线性TF缩放。通过将sublinear_tf
设置为True,可以使用子线性缩放来平衡长文本和短文本的特征权重,从而提高模型对不同长度文本的适应性。
修改sublinear_tf
6.norm
:特征向量的归一化方式。通过调整norm
参数,可以选择不同的归一化方式,如'l2'、'l1'或'none',以适应不同的数据分布。
修改norm
# 生成测试集结果
m = LogisticRegression()
m.fit(train_tfidf_feat, train_data['label'])
test_pred = m.predict(test_tfidf_feat)
test_data['label'] = test_pred
test_data[['name', 'label']].to_csv('lr.csv', index=None)