【机器学习实战中阶】基于机器学习的人格预测,测试你的人格
你的性格是什么?
迈尔斯-布里格斯类型指标(或简称 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 值方面表现良好。
参考资料
资料名称 | 链接 |
---|---|
What’s Your MBTI? | https://www barricini alexandre/G//----------------------------->.com/mbti |
Myers-Briggs Type Indicator (MBTI) Overview | https://www.myersbriggs.org/ |
MBTI Type Distribution | https://www.truity.com/page/mbti-type-distribution |
MBTI and the Workplace | https://www.psychometric-success.com/personality-tests/personality-tests-hr-and-life-coaching/mbti-and-the-workplace |
Understanding MBTI | https://www.personalitypage.com/html/16_types.html |
MBTI Validity and Reliability | https://www.psychologytoday.com/us/basics/mbti |
MBTI in Research | https://www.researchgate.net/publication/326371825_The_Myers-Briggs_Type_Indicator_and_Personality_Research |
MBTI Code Explanation | https://www.typecode.org/ |
MBTI and Career Choices | https://www.careerplanner.com/career-assessments/mbti-and-career-choices.cfm |
MBTI and Group Dynamics | https://www.mbtionline.com/group-dynamics/ |
MBTI and Leadership Styles | https://www.everwise.com/blog/mbti-and-leadership-styles/ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)