【机器学习实战中阶】基于机器学习的人格预测,测试你的人格

在这里插入图片描述

你的性格是什么?

在这里插入图片描述

迈尔斯-布里格斯类型指标(或简称 MBTI)是一种性格类型系统,它将所有人分为 16 种不同的性格类型,这些类型分布在 4 个轴上:

内向 (I) – 外向 (E)
直觉 (N) – 感觉 (S)
思考 (T) – 情感 (F)
判断 (J) – 知觉 §

例如,一个更倾向于内向、直觉、思考和知觉的人在 MBTI 系统中会被标记为 INTP。根据这个标签,会有许多基于性格的组件来描述或建模这个人的偏好或行为。

MBTI 测试,无论是在企业中、在线上、作为娱乐活动还是用于研究,都是世界上使用最广泛的性格测试之一。简单的谷歌搜索就能揭示出该测试在不同领域中的应用方式。可以说,这个测试在世界范围内仍然非常相关,尤其是在使用方面。

数据集下载链接: 【机器学习实战中阶】基于机器学习的人格预测,测试你的人格

使用的库

import pandas as pd
from catboost import CatBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from wordcloud import WordCloud
from tqdm import tqdm
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords
import re
from sklearn.model选择 import train_test_split
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import MultinomialNB
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
from imblearn.over_sampling import SMOTE
import plotly.express as px
import warnings
warnings.filterwarnings('ignore')

这段代码导入了多个库,用于数据处理、特征提取、模型训练和评估。目的是为后续的代码提供必要的工具和函数。

读取和查看数据

data = pd.read_csv('../input/mbti-type/mbti_1.csv')
data.head()

这段代码读取了本地文件中的 MBTI 数据,并显示前几行以了解数据结构。
在这里插入图片描述

data.describe(include='O')

这段代码描述了数据中对象类型列的基本统计信息,以便了解文本数据的特征。
在这里插入图片描述

data['type'].value_counts()

这段代码统计了不同 MBTI 类型的频次,以了解数据集中各类型的比例。
在这里插入图片描述

data.info()

这段代码提供了数据集的详细信息,包括列的数量、类型和非空值的数量。
在这里插入图片描述

查看原始帖子数据

data.posts[0]

这段代码显示了数据集中第一个帖子的内容,以便查看原始文本数据。
在这里插入图片描述

数据分层拆分

# 分层拆分以确保数据的均衡分布
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42, stratify=data.type)

这段代码将数据集分为训练集和测试集,使用分层拆分确保训练集和测试集中各 MBTI 类型的比例一致。

文本预处理

def clear_text(data):
    data_length = []
    lemmatizer = WordNetLemmatizer()
    cleaned_text = []
    for sentence in tqdm(data.posts):
        sentence = sentence.lower()  # 将句子转换为小写
        # 从文本数据中移除链接
        sentence = re.sub('https?://[^\s<>"]+|www\.[^\s<>"]+', ' ', sentence)
        # 移除其他符号
        sentence = re.sub('[^0-9a-z]', ' ', sentence)
        data_length.append(len(sentence.split()))  # 统计每个句子的单词数
        cleaned_text.append(sentence)  # 将清理后的文本添加到列表中
    return cleaned_text, data_length

这段代码定义了一个函数 clear_text,用于清理文本数据。函数的主要目的是将帖子中的文本转换为小写,移除链接和其他符号,并统计每个句子的单词数。

train_data.posts, train_length = clear_text(train_data)

这段代码调用 clear_text 函数清理训练集中的帖子,并获取每个训练帖子的单词数。
在这里插入图片描述

test_data.posts, test_length = clear_text(test_data)

这段代码调用 clear_text 函数清理测试集中的帖子,并获取每个测试帖子的单词数。
在这里插入图片描述

可视化单词数分布

plt.figure(figsize=(15,10))
sns.distplot(train_length, label='训练集单词数')
sns.distplot(test_length, label='测试集单词数')
plt.title('文本中的单词数', fontdict={'size': 20, 'style': 'italic'})
plt.legend()
plt.show()

这段代码使用 Seaborn 库绘制训练集和测试集中每个帖子的单词数分布图,以便可视化数据的统计特征。
在这里插入图片描述

可视化 MBTI 类型分布

px.pie(train_data, names='type', title='性格类型', hole=0.3)

这段代码使用 Plotly 库绘制训练集中各 MBTI 类型的饼图,以便可视化不同类型的分布情况。

词形还原器定义

class Lemmatizer(object):
    def __init__(self):
        self.lemmatizer = WordNetLemmatizer()  # 初始化词形还原器
    
    def __call__(self, sentence):
        return [self.lemmatizer.lemmatize(word) for word in sentence.split() if len(word) > 2]  # 对句子中的每个单词进行词形还原,排除长度小于2的单词

这段代码定义了一个类 Lemmatizer,用于对文本中的单词进行词形还原。词形还原是将单词还原为其词根形式的过程,有助于减少词汇的多样性并提高模型的准确性。

文本向量化

vectorizer = TfidfVectorizer(max_features=5000, stop_words='english', tokenizer=Lemmatizer())
vectorizer.fit(train_data.posts)

这段代码创建了一个 TF-IDF 向量化器,并使用训练集中的帖子对其进行拟合。TF-IDF(词频-逆文档频率)是一种用于文本数据的特征选择方法,可以将文本数据转换为数值特征。

feature_names = vectorizer.get_feature_names()
wc = WordCloud(max_words=400)
wc.generate(' '.join(word for word in feature_names[500:3500]))
plt.figure(figsize=(20,15))
plt.axis('off')
plt.imshow(wc)

这段代码生成了一个词云图,展示了 TF-IDF 向量化器提取的特征词。词云图有助于可视化文本中最常见的词汇。
在这里插入图片描述

文本向量化后的数据转换

train_post = vectorizer.transform(train_data.posts).toarray()
test_post = vectorizer.transform(test_data.posts).toarray()

这段代码将清理后的训练集和测试集中的帖子文本转换为 TF-IDF 特征矩阵,以便后续的模型训练和评估。

train_post.shape

这段代码查看训练集特征矩阵的形状,确保数据转换正确。

标签编码

target_encoder = LabelEncoder()
train_target = target_encoder.fit_transform(train_data.type)
test_target = target_encoder.fit_transform(test_data.type)

这段代码使用 LabelEncoder 对标签(MBTI 类型)进行编码,将字符串标签转换为数值标签,以便模型可以处理。

模型选择

models_accuracy = {}

这段代码初始化一个字典 models_accuracy,用于存储不同模型的预测准确率。

逻辑回归模型

model_log = LogisticRegression(max_iter=3000, C=0.5, n_jobs=-1)
model_log.fit(train_post, train_target)

这段代码创建了一个逻辑回归模型,并使用训练集数据对其进行训练。逻辑回归是一种线性模型,适用于多分类任务。

print('训练集分类报告  ', classification_report(train_target, model_log.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。
在这里插入图片描述

print('测试集分类报告  ', classification_report(test_target, model_log.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['逻辑回归'] = accuracy_score(test_target, model_log.predict(test_post))

这段代码计算并存储逻辑回归模型在测试集上的准确率。

线性支持向量分类器

model_linear_svc = LinearSVC(C=0.1)
model_linear_svc.fit(train_post, train_target)

这段代码创建了一个线性支持向量分类器,并使用训练集数据对其进行训练。线性支持向量机是一种用于线性分类的模型。

print('训练集分类报告  ', classification_report(train_target, model_linear_svc.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_linear_svc.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['线性支持向量分类器'] = accuracy_score(test_target, model_linear_svc.predict(test_post))

这段代码计算并存储线性支持向量分类器在测试集上的准确率。

支持向量分类器

model_svc = SVC()
model_svc.fit(train_post, train_target)

这段代码创建了一个支持向量分类器,并使用训练集数据对其进行训练。支持向量机是一种用于非线性分类的模型。

print('训练集分类报告  ', classification_report(train_target, model_svc.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_svc.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['支持向量分类器'] = accuracy_score(test_target, model_svc.predict(test_post))

这段代码计算并存储支持向量分类器在测试集上的准确率。

多项式朴素贝叶斯分类器

model_multinomial_nb = MultinomialNB()
model_multinomial_nb.fit(train_post, train_target)

这段代码创建了一个多项式朴素贝叶斯分类器,并使用训练集数据对其进行训练。多项式朴素贝叶斯是一种常用于文本分类的模型。

print('训练集分类报告  ', classification_report(train_target, model_multinomial_nb.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_multinomial_nb.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['多项式朴素贝叶斯'] = accuracy_score(test_target, model_multinomial_nb.predict(test_post))

这段代码计算并存储多项式朴素贝叶斯分类器在测试集上的准确率。

决策树分类器

model_tree = DecisionTreeClassifier(max_depth=14)
model_tree.fit(train_post, train_target)

这段代码创建了一个决策树分类器,并使用训练集数据对其进行训练。决策树是一种基于树结构的分类模型。

print('训练集分类报告  ', classification_report(train_target, model_tree.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_tree.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['决策树分类器'] = accuracy_score(test_target, model_tree.predict(test_post))

这段代码计算并存储决策树分类器在测试集上的准确率。

随机森林分类器

model_forest = RandomForestClassifier(max_depth=10)
model_forest.fit(train_post, train_target)

这段代码创建了一个随机森林分类器,并使用训练集数据对其进行训练。随机森林是一种集成学习方法,由多个决策树组成。

print('训练集分类报告  ', classification_report(train_target, model_forest.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_forest.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['随机森林分类器'] = accuracy_score(test_target, model_forest.predict(test_post))

这段代码计算并存储随机森林分类器在测试集上的准确率。

XGBoost 分类器

model_xgb = XGBClassifier(gpu_id=0, tree_method='gpu_hist', max_depth=5, n_estimators=50, learning_rate=0.1)
model_xgb.fit(train_post, train_target)

这段代码创建了一个 XGBoost 分类器,并使用训练集数据对其进行训练。XGBoost 是一种高效的梯度提升框架,支持 GPU 加速。

print('训练集分类报告  ', classification_report(train_target, model_xgb.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_xgb.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['XGBoost 分类器'] = accuracy_score(test_target, model_xgb.predict(test_post))

这段代码计算并存储 XGBoost 分类器在测试集上的准确率。

CatBoost 分类器

model_cat = CatBoostClassifier(loss_function='MultiClass', eval_metric='MultiClass', task_type='GPU', verbose=False)
model_cat.fit(train_post, train_target)

这段代码创建了一个 CatBoost 分类器,并使用训练集数据对其进行训练。CatBoost 是一种高效的梯度提升框架,特别适用于处理分类特征。

print('训练集分类报告  ', classification_report(train_target, model_cat.predict(train_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出训练集的分类报告,包括精确度、召回率和 F1 分数等指标。

print('测试集分类报告  ', classification_report(test_target, model_cat.predict(test_post), target_names=target_encoder.inverse_transform([i for i in range(16)])))

这段代码输出测试集的分类报告,以便评估模型在未见过的数据上的性能。
在这里插入图片描述

models_accuracy['CatBoost 分类器'] = accuracy_score(test_target, model_cat.predict(test_post))

这段代码计算并存储 CatBoost 分类器在测试集上的准确率。

模型准确率总结

models_accuracy

这段代码输出存储的各个模型在测试集上的准确率。
在这里插入图片描述

models_accuracy.keys()

这段代码输出存储的模型名称。

accuracy = pd.DataFrame(models_accuracy.items(), columns=['模型', '测试准确率'])

这段代码将模型及其准确率转换为 DataFrame,以便进行进一步的处理和可视化。

accuracy.sort_values(by='测试准确率', ascending=False, ignore_index=True).style.background_gradient(cmap='Blues')

这段代码对模型的准确率进行排序,并使用渐变颜色进行可视化,以便清晰地显示各个模型的性能。
在这里插入图片描述

结论

CatBoost 模型在预测 MBTI 值方面表现良好。

参考资料

posted @   爱上编程技术  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示