文章目录
- 项目背景
- 数据清洗
- 导包
- 导入数据
- 切分评论及标签
- 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的简单总结:
-
数据压缩:PCA通过降维减少数据集的复杂性,使得数据存储和处理更加高效。
-
特征提取:它能够从原始数据中提取最重要的特征(主成分),这些特征捕捉了数据的主要变化。
-
去相关:PCA能够去除特征之间的相关性,使得新的特征(主成分)是正交的。
-
数据预处理:通常在应用PCA之前,需要对数据进行标准化处理,确保每个特征的均值为0,标准差为1。
-
协方差矩阵:PCA通过协方差矩阵来确定数据的主方向,即方差最大的方向。
-
特征值和特征向量:协方差矩阵的特征值和对应的特征向量决定了主成分。特征值表示主成分的重要性,而特征向量表示主成分的方向。
-
选择主成分:根据特征值的大小,选择前几个最重要的特征向量,这些向量构成了新的特征空间。
-
线性变换:原始数据通过与选定的特征向量矩阵相乘,转换到新的特征空间,完成降维。
-
应用广泛:PCA广泛应用于机器学习、图像处理、信号处理等领域。
-
局限性: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【基于深度学习的文本分类3-BERT】
也可以参考进行学习
学习的参考资料:
B站