天天看点

kaggle--titanic(3)

之前已经对元数据集做了初步处理,确定了我们要保留、要舍弃和创造的相应feature,现在可以进行建模了。

机器学习的模型有很多种,所以我们要根据任务类型来判断使用哪种模型比较合理。之前看到过,在kaggle的竞赛上,一般排名比较靠前的都会使用集成方法。

我们这个问题的目标是判断每个乘客是否幸存,是一个分类问题,且是一个有监督问题。

先处理一下训练集和测试集。

X_train = train_data.drop('Survived',axis=1)
Y_train = train_data['Survived']
X_test = test_data.drop('PassengerId',axis=1).copy()
           

接下来开始尝试不同的模型:

首先是线性回归模型,这是比较基础的模型。他是使用logistic函数来估计概率,来计算因变量与多个自变量(特征)之间的关系。下面代码中score函数的作用是使用已经用train_data训练得到的model,再预测出一个新的结果y`,计算这个y`和正确的结果y之间的相似度,评估这个模型的效果。为什么这么做呢,我觉得是为了防止过拟合。因为经过建模后得到了一个完全利用了train_data中每一个数据的模型,导致下面代码中的acc_log=100%,那么有极大可能说明过拟合了。

logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
Y_pred = logreg.predict(X_test)
acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
print(acc_log)
           

除此之外,我们也可以使用logistic函数来判断我们之前通过对特征的完善做出的决定和假设是否正确,这个评判标准可以通过决策函数中不同特征与任务目标之间的系数来表现。(相当于一次函数、二次函数之间的系数)。

系数绝对值越大越好,因为绝对值越大,代表这个特征的改变越会引起任务目标的变化,意味着这个feature在整个model中起到了较大的作用。

coeff_df = pd.DataFrame(train_df.columns.delete(0))
coeff_df.columns = ['Feature']
coeff_df["Correlation"] = pd.Series(logreg.coef_[0])

print(coeff_df.sort_values(by='Correlation', ascending=False))
           

第二个模型是支持向量机,支持向量机也是非常普遍的模型。没记错的话应该是用到了降维的思想和margin的概念。

svc = SVC()
svc.fit(X_train, Y_train)
Y_pred = svc.predict(X_test)
acc_svc = round(svc.score(X_train, Y_train) * 100, 2)
print(acc_svc)
           

然后是KNN算法,这个算法经常被用于聚类算法之中。

knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
acc_knn = round(knn.score(X_train, Y_train) * 100, 2)
print(acc_knn)
           

perceptron是一种用于解决二分类的监督学习问题的方法,给定一组用向量表示的input决定是否属于哪个类。也是一种线性分类方法。

# Perceptron

perceptron = Perceptron()
perceptron.fit(X_train, Y_train)
Y_pred = perceptron.predict(X_test)
acc_perceptron = round(perceptron.score(X_train, Y_train) * 100, 2)
print(acc_perceptron)
           

随机森林,是一种集成模型,相当于把许多棵决策树组合起来,分别训练,最后的结果取的是这些模型的平均值或者其他形式。

# Random Forest

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)
print(acc_random_forest)
           

对于这个任务我们的结果也是采用随机森林的训练输出。

提交之后,最后的score是0.765,排在了14343+名哈哈哈。

总结

差不多跟着做了一遍,感觉调用模型的过程倒也没什么难的,毕竟调用的都是简单的模型,而且我们对于参数也没有说要进行很好的调整。

感受如下:

1.首先要对元数据集进行观察,找出可用的feature。然后对不同的feature采用不同的操作,比如进行舍弃或者进行二次加工。

2.要把所有的feature的值都要转化为数值型,对于一些连续型变量可以适当分组,然后用不同的序号表示。

3.可以用logistic函数来判断某些特征是否在model中起到了重要作用,即某些特征和任务目标之间的系数关系是否足够大。

暂时想到的就是这些。还是有一些收获的。

继续阅读