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


项目背景

项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据进行数据清洗环节,前面已对数据进行清洗,详情可移步至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站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值