DonorsChoose.org是一个在线慈善众筹平台,它允许教师通过在线门户提交材料和特定设备的需求,以确保所有孩子都有平等的教育机会。这个项目是基于Kaggle竞赛“预测DonorsChoose.org上的兴奋度”而建立的,旨在寻找既值得注意又成功的项目。
DonorsChoose平台利用众筹来缩小教育资金缺口。自2000年以来,他们已经帮助美国4000万学生获得了9.7亿美元的捐款。然而,大约三分之一的项目在首次发布后的四个月内无法完成目标。通过确保更多项目达到筹资目标,这个项目将帮助DonorsChoose缩小教育资金缺口。将构建一个早期预警系统,检测最近发布的项目可能无法达到财务目标,使DonorsChoose能够通过捐赠匹配奖励进行干预。
DonorsChoose是一个公开可用的数据集,提供有关美国教师提出的学校项目的信息。通过使用机器学习模型来确定捐赠者的行为,并从数据集中筛选出重要的项目,该建议将解决保持现有贡献者的问题。
本文将重点介绍文本预处理的主题。将总结所有重要的步骤,但不会深入理论背景。对于理论背景,请参考之前的帖子,在那里详细解释了所做的工作和原因。
竞赛的目标是在DonorsChoose数据集上实现不同的机器学习算法,并计算/分析测试数据集的准确性。导入所有必要的库以执行分析。
# 导入必要的库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import normalize
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import roc_auc_score
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV
首先,需要加载数据集,并对其进行初步的探索性数据分析。
data = pd.read_csv('preprocessed_data-Copy1.csv')
print(data.shape)
print(data["project_is_approved"].value_counts(normalize=True))
data.describe(include=["object", "bool"])
将使用分层抽样将数据分为训练集和测试集。
y = data['project_is_approved'].values
X = data.drop(['project_is_approved'], axis=1) # 删除目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y, random_state=42)
将使用词袋模型(BOW)和TF-IDF模型来编码文本特征,如项目描述或标题。
vectorizer = CountVectorizer(min_df=10, ngram_range=(1, 4), max_features=7000)
tfidf_vector = TfidfVectorizer(min_df=10, max_features=7000)
接下来,将编码分类特征和数值特征。
vectorizer_state = CountVectorizer()
normalizer = normalize
将合并所有编码后的特征,以便用于模型训练。
from scipy.sparse import hstack
X_tr = hstack((X_train_essay, 'All encoded features')).tocsr()
X_te = hstack((X_test_essay, 'All encoded features')).tocsr()
将应用朴素贝叶斯分类器来预测项目是否能够成功。
naive_bayes_1 = MultinomialNB(class_prior=[0.5, 0.5])
parameter_1 = {'alpha': list(np.arange(0.001, 100, 2))}
classifier_1 = GridSearchCV(naive_bayes_1, parameter_1, scoring='roc_auc', cv=10, return_train_score=True)
classifier_1.fit(X_tr, y_train)
词云是一种文本数据可视化方法,其中最常用的术语以最大的字体大小显示。
words_string = (" ").join(fp_words)
wordcloud = WordCloud(width=1000, height=500).generate(words_string)
plt.figure(figsize=(25, 10))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
model = DecisionTreeClassifier()
clf = GridSearchCV(model, param_grid, cv=3, scoring='roc_auc', return_train_score=True)
clf.fit(X_train1, y_train)
from sklearn.ensemble import GradientBoostingClassifier
parameters = {"max_depth": [1, 2, 3, 4], "min_samples_split": [5, 10, 15, 20]}
clf = GridSearchCV(GradientBoostingClassifier(), parameters, cv=5, scoring='roc_auc', return_train_score=True, n_jobs=-1)
clf.fit(X_train1, y_train)