NLP_情感分类_机器学习(TF-IDF) + PCA 降维方案

news/2024/9/30 8:37:11 标签: 机器学习, 自然语言处理, 分类

文章目录

  • 项目背景
  • 数据清洗
    • 导包
    • 导入数据
    • 切分评论及标签
    • TF-IDF
    • PCA 降维
      • PCA的代码示例(使用scikit-learn):
      • 构造TF-IDF特征
    • 数据切分
    • 模型训练
    • 查看结果
  • 同类型项目


项目背景

项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据进行数据清洗环节,前面已对数据进行清洗,详情可移步至NLP_情感分类_数据清洗

下面对已清洗的数据集,用机器学习(TF-IDF) + PCA 降维方案进行处理

数据清洗

导包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm import tqdm
import pickle
import numpy as np
import gc
#import swifter
from sklearn.neural_network import MLPClassifier
import os
from sklearn.metrics import accuracy_score,f1_score,recall_score,precision_score
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
from lightgbm import LGBMClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm

导入数据

df = pd.read_csv('data/sentiment_analysis_clean.csv')
df = df.dropna()

切分评论及标签

X_tfidf = df['text']
y_tfidf = df['label']

TF-IDF

TfidfVectorizer是用于文本处理的重要工具之一,它将文本数据转换成数值向量形式,以便于后续的机器学习模型进行训练。TF-IDF代表Term Frequency-Inverse Document Frequency,即词频-逆文档频率算法。

TF-IDFVectorizer可以根据应用场景灵活地控制特征提取的过程,提高文本分析的效率和精度。

TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。

TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)

PCA 降维

PCA(主成分分析)是一种常用的数据降维技术,它的主要目的是减少数据集的维度,同时尽可能保留原始数据的变异性。以下是PCA的简单总结:

  1. 数据压缩:PCA通过降维减少数据集的复杂性,使得数据存储和处理更加高效。

  2. 特征提取:它能够从原始数据中提取最重要的特征(主成分),这些特征捕捉了数据的主要变化。

  3. 去相关:PCA能够去除特征之间的相关性,使得新的特征(主成分)是正交的。

  4. 数据预处理:通常在应用PCA之前,需要对数据进行标准化处理,确保每个特征的均值为0,标准差为1。

  5. 协方差矩阵:PCA通过协方差矩阵来确定数据的主方向,即方差最大的方向。

  6. 特征值和特征向量:协方差矩阵的特征值和对应的特征向量决定了主成分。特征值表示主成分的重要性,而特征向量表示主成分的方向。

  7. 选择主成分:根据特征值的大小,选择前几个最重要的特征向量,这些向量构成了新的特征空间。

  8. 线性变换:原始数据通过与选定的特征向量矩阵相乘,转换到新的特征空间,完成降维。

  9. 应用广泛:PCA广泛应用于机器学习、图像处理、信号处理等领域。

  10. 局限性:PCA假设数据的主要成分是线性的,因此它不适用于所有类型的数据,特别是当数据的主要成分是非线性时。

PCA通过这些步骤,能够在保留数据主要信息的同时,减少数据的维度,提高数据处理的效率。

PCA的代码示例(使用scikit-learn):

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np

# 假设X是原始数据
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 初始化PCA,设置降维后的维度为2
pca = PCA(n_components=2)

# 对数据进行PCA转换
X_pca = pca.fit_transform(X_scaled)

print(f'Original Shape: {X.shape}')
print(f'Transformed Shape: {X_pca.shape}')
print(f'Transformed Data:\n{X_pca}')

在这个例子中,我们首先对数据进行了标准化处理,然后使用PCA将数据降维到2维。这样可以将原始的3维数据投影到2维平面上,便于可视化和进一步分析。

构造TF-IDF特征

from sklearn.feature_extraction.text import TfidfVectorizer

vec_tfidf = TfidfVectorizer(use_idf=True, smooth_idf=True, norm=None, max_features=500)
array_TFIDF = vec_tfidf.fit_transform(X_tfidf)
array_TFIDF = array_TFIDF.toarray()
# 导入所需库
import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 初始化 PCA,设置降维后的特征数为100
pca = PCA(n_components=100)

# 对数据进行 PCA 转换
transformed_data = pca.fit_transform(array_TFIDF)

数据切分

from sklearn.model_selection import train_test_split, StratifiedKFold
# 这里指定了random_state是为了保证每次切分数据集的结果都是一样的
Xidf_train, Xidf_test, yidf_train, yidf_test = train_test_split(transformed_data, y_tfidf,test_size=0.2,random_state=2024)
#Xidf_train = Xidf_train.toarray()
#Xidf_test = Xidf_test.toarray()

del df,array_TFIDF
gc.collect()

模型训练

def train_model(model, X_train, X_test, y_train, y_test):
    
    dic = {'lr':'Logistic Regression',
          'nb':'Naive Bayes',
          'svm':'Support Vector Machine',
          'dt':'Decision Tree',
          'rf':'Random Forest',
          'lgb':'LightGBM'}
    
    train_acc, test_acc = [], []
    
    if model == 'lr':
        clf = LogisticRegression(C=0.01, solver='liblinear')
    elif model == 'nb':
        clf = MultinomialNB(alpha=100)
    elif model == 'svm':
        clf = svm.LinearSVC(C=0.01)
    elif model == 'dt':
        clf = DecisionTreeClassifier(max_depth=100, min_samples_split= 2)
    elif model == 'rf':
        clf = RandomForestClassifier(max_depth=100,min_samples_split=5)
    elif model == 'lgb':
        clf = LGBMClassifier(learning_rate=1.0)
    else:
        print('Model doesn\'t exist')

    clf.fit(X_train, y_train)

    # predict using train data
    train_pred = clf.predict(X_train)
    train_acc = accuracy_score(y_train, train_pred)
    
    # predict using test data
    test_pred = clf.predict(X_test)
    test_acc = accuracy_score(y_test, test_pred)   

    print()
    print("Model: ", dic[model])
    print("Training accuracy: {}".format(train_acc))
    print("Test accuracy: {}".format(test_acc))
    print()

    return {
        'model_name':dic[model],
        'Train Accuracy':train_acc,
        'Test Accuracy':test_acc
    }

查看结果

metric_df = pd.DataFrame(columns=['model_name','Train Accuracy','Test Accuracy'])
for model in ['lr', 'nb', 'svm', 'dt', 'rf', 'lgb']:
    metric = train_model(model ,Xidf_train, Xidf_test, yidf_train, yidf_test)
    # 将metric转换成一个DataFrame
    metric_df = pd.concat([metric_df, pd.DataFrame([metric])], ignore_index=True)

在这里插入图片描述

metric_df

在这里插入图片描述

同类型项目

阿里云-零基础入门NLP【基于机器学习的文本分类

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】
也可以参考进行学习


学习的参考资料:
B站


http://www.niftyadmin.cn/n/5684730.html

相关文章

【Python报错已解决】TypeError: ‘int‘ object is not subscriptable

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

vue admin 若依框架 解决无权限时进入死循环的问题 auths

核心原因: if (auths && auths.length > 0) { // like12 find bug,数组为空[]时依然会进入死循环 原来为:if (auths) // 获取用户信息getInfo({ commit, state }) {return new Promise((resolve, reject) > {getInfo(state.token).then(…

召回11 地理位置召回、作者召回、缓存召回

有用但重要性不高 地理位置召回 GeoHash召回:对身边周围的事情感兴趣 GeoHash把经纬度编码成二进制哈希码方便检索。召回只根据经纬度这个地理位置,返回一批优质笔记,完全不考虑用户兴趣,也是因此返回优质笔记,大概…

AI学习指南深度学习篇-批标准化在深度学习中的应用

AI学习指南深度学习篇-批标准化在深度学习中的应用 引言 批标准化(Batch Normalization, BN)是一种在深度学习中常用的技术,旨在加速训练过程并提高模型的稳定性。它通过标准化每一个小批量的激活值,减小内部协变量偏移&#xf…

Android build子系统(01)Ninja构建系统解读

说明:本文将解读Ninja构建系统,这是当前Android Framework中广泛使用的构建工具。我们将从Ninja的起源和背景信息开始,逐步解读Ninja的优势和核心原理,并探讨其一般使用场景。然后介绍其在Android Framework中的应用及相关工具&am…

Linux中查找在某一文件夹下有没有给定名字的文件

在Linux系统中,如果你想要从一个目录及其子目录中找到名为ActivityManagerService的文件,你可以使用find命令。这个命令可以递归地搜索指定目录下的所有文件和目录。 以下是一个基本的命令示例,它会在当前目录及其所有子目录中搜索名为Activ…

matlab-对比两张图片的HSV分量的差值并形成直方图

%对比两张图片的HSV分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…