Titanic Kaggle 竞赛技术小结(三|终)

写在开头:在本节中仅展示python中调用机器学习的方法,已经评价的方法,具体对于每种机器学习模型的算法与理解,可能会在后面的章节进行展开。

回归前文

在前文中我们分享了一些数据查看和清洗的技巧,一些在Titanic 比赛上的数据可视化技巧。可以点击链接进行查看,
Titanic Kaggle 竞赛技术小结(一)
Titanic Kaggle 竞赛技术小结(二)

技术总结

一、全文思路
Step1. 载入数据、包,并查看数据;
Step2. 对数据进行清洗,包括去重复值、异常值、缺失值或特征化数值化处理;
Step3. 利用数据可视化,寻找有价值的变量与变量分组;
Step4. 利用可行的机器学习、深度学习模型进行模型训练;
Step5. 对不同模型的效果进行评估,交叉验证、重要变量筛选、查准率、查全率、F值、ROC-AUC等进行评价;
Step6. 保存数据,结束。
二、关键程序
(此处不展示完整分析过程与代码,只对使用到的函数进行总结,完整项目可见后续文章以及机器学习模型的扩展见后续文章)
Step4. 利用可行的机器学习、深度学习模型进行模型训练。
对于Titanic模型主要涉及的是一个二分类的问题,也就是传统的0-1问题,解决此类问题比较常见的有逻辑回归(LR),决策树(DT),KNN,感知机等,其中具体的算法可以看李航老师《统计学习方法》中对应的章节有相应的详细讲解,可能后续文章会对这些机器学习的方法进行分享,下面展示实现机器学习的部分代码。

#机器学习包-二分类问题
#常见方法模型:LR、随机森林、感知机、梯度下降、DT、KNN、支持向量机、贝叶斯分类器
from sklearn import linear_model
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC, LinearSVC
from sklearn.naive_bayes import GaussianNB
train_df = train_df.drop(['Name'], axis=1)
test_df = test_df.drop(['Name'], axis=1)
X_train = train_df.drop('Survived',axis=1)
Y_train = train_df['Survived']
X_test = test_df.copy() # 这里的copy就相当于一个映射两者会共同改变,deepcopy才是复制
#梯度下降法
sgd = linear_model.SGDClassifier(max_iter=5, tol=None)
sgd.fit(X_train, Y_train)
acc_sgd = round(sgd.score(X_train, Y_train)*100, 2)
#随机森林
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
acc_rf = round(random_forest.score(X_train, Y_train)*100,2)
#逻辑回归
logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
acc_logreg= round(logreg.score(X_train, Y_train)*100,2)
#KNN
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, Y_train)
acc_knn = round(knn.score(X_train, Y_train)*100,2)
#贝叶斯分类器
gaussian = GaussianNB()
gaussian.fit(X_train, Y_train)
acc_gau = round(gaussian.score(X_train, Y_train)*100,2)
#感知机
perceptron = Perceptron(max_iter=5)
perceptron.fit(X_train, Y_train)
acc_per = round(perceptron.score(X_train, Y_train)*100,2)
#支持向量机
linear_svc = LinearSVC()
linear_svc.fit(X_train, Y_train)
acc_svc = round(linear_svc.score(X_train, Y_train)*100, 2)
#决策树
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
acc_dt = round(decision_tree.score(X_train, Y_train)*100,2)

#模型筛选
result = pd.DataFrame({
    'Modle': ['Support Vector Machinse', 'KNN','Logistic Regression',
             'Random Forest', 'Naive Bayes', 'Perceptron','Stochastic Gradient Decent',
             'Decision Tree'],
    'Score':[acc_svc, acc_knn, acc_logreg, acc_rf, acc_gau, acc_per, acc_sgd, acc_dt]
})
# sort_values就是排序用的
result_df = result.sort_values(by = 'Score', ascending= False)
result_df = result_df.set_index('Score') # 制定那个在第一列
result_df.head(9)
Score	Modle
94.85	Decision Tree
94.84	Random Forest
87.21	KNN
79.57	Logistic Regression
76.66	Naive Bayes
76.43	Perceptron
70.48	Support Vector Machinse
38.72	Stochastic Gradient Decent

可以看到决策树的预测效果在训练集上是最好的,预测精度高达94.75%,然后是随机森林的效果跟决策树差不多,那么在本节中,我们就针对决策树模型进行效果的评估与调参。
模型初步评估
这里使用10折交叉验证的方法,进行模型的评估

from sklearn.model_selection import cross_val_score
dt = DecisionTreeClassifier()
scores = cross_val_score(dt, X_train, Y_train,cv=10,scoring='accuracy')
print("Scores",scores)
print('Mean',scores.mean())
print("st",scores.std())
Scores [0.67777778 0.75555556 0.70786517 0.83146067 0.78651685 0.78651685
 0.85393258 0.76404494 0.79775281 0.81818182]
Mean 0.77796050391556
st 0.05141546081049484

决策树模型的平均预测精度为77.79%,且均标准差较小,整体还是能够接受的。
下面我们去除掉一些不重要的因素,

importances = pd.DataFrame({'feature':X_train.columns, 'importance':np.round(decision_tree.feature_importances_,3)})
importances = importances.sort_values('importance',ascending=False).set_index('feature')
importances.head(15)
importances.plot.bar()

在这里插入图片描述
这里使用的是基于决策树的特征选择,可以看到Parch和Embarked重要程度最低,于是考虑将这两个变量进行剔除.

train_df = train_df.drop('Parch', axis=1)
test_df = test_df.drop('Parch', axis=1)
X_train = train_df.drop(['Survived'], axis=1)
Y_train = train_df['Survived']
X_test = test_df
decision_tree.fit(X_train,Y_train)
Y_pred = decision_tree.predict(X_test)
acc_decision_tree = round(decision_tree.score(X_train, Y_train)*100,2)
print(acc_decision_tree,"%")
94.28 %

在剔除不重要变量后,模型的预测精度与原来的差别不大,但在一定程度上降低了过拟合的风险。至于决策树的参数调整在此处仅展示有哪些参数可以调整。

 DecisionTreeClassifier()
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                       max_features=None, max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, presort=False,
                       random_state=None, splitter='best')

模型预测效果评价

#查准率、查全率
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix
predictions = cross_val_predict(decision_tree, X_train, Y_train, cv=3)
confusion_matrix(Y_train, predictions)
from sklearn.metrics import precision_score, recall_score
print('Precision', precision_score(Y_train, predictions))
print('Recall', recall_score(Y_train, predictions))
#ROC-AUC值
y_scores = decision_tree.predict_proba(X_train)
y_scores = y_scores[:,1]
from sklearn.metrics import roc_auc_score
r_a_score = roc_auc_score(Y_train, y_scores)
print("ROC-AUC-Score:", r_a_score)
#查准率、查全率、ROC-AUC值
Precision 0.73125
Recall 0.6842105263157895
ROC-AUC-Score: 0.9906821546884821

从查准率和查全率,ROC-AUC值可以看出,整体表现一般,因为在数据特征处理和方法这一块还有一些缺陷,不过在本文中我们主要是展示方法在python中的使用。
结语
对于Titanic项目中python的运用技术小结,到此就结束了,本系列仅以展示功能的使用为主,对于完整项目的分析,可以在kaggle上查看Titanic对应的notebooks进行学习,在这里就不再进分享。
谢谢阅读

发布了4 篇原创文章 · 获赞 9 · 访问量 312

猜你喜欢

转载自blog.csdn.net/qq_35149632/article/details/104348394