Coggle 30 Days of ML(23年7月)-task4

该文介绍了一个任务,涉及使用TFIDF特征和线性模型(如逻辑回归)来区分人写的文本和机器生成的文本。通过预处理数据,构建TFIDF矩阵,然后用交叉验证评估模型性能,以提高准确率、精确率和召回率。最终,模型应用于测试集并生成预测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#### 任务四:使用TFIDF特征和线性模型完成训练和预测
  • 说明:在这个任务中,你需要使用TFIDF特征和线性模型(如逻辑回归)完成训练和预测,通过机器学习算法来区分人类编写的文本和机器生成的文本。
  • 实践步骤:
    1. 准备TFIDF特征矩阵和相应的标签。
    2. 划分训练集和验证集集。
    3. 使用Sklearn中的线性模型(如逻辑回归)进行训练,并使用训练好的模型对验证集集进行预测。
    4. 评估模型的性能,如准确率、精确率、召回率等指标。
    5. 选择得到合适的模型,对测试集进行预测,并提高到比赛页面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_dfmin_df:单词的最大和最小文档频率。通过调整max_dfmin_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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值