伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目

Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场(如果这变成了有用的东西,我们可以跟进回归或更复杂的分类问题)。Scikit-learn(sklearn)是一个成熟的开源机器学习库,在NumPy,SciPy和Cython的帮助下用Python编写。

数据集描述

这是一个包含 40 个特征的合成数据集,表示来自两个类(标记为 0 或 1)的对象。训练集有 1000 个样本,测试集有 9000 个样本。

这是一个二元分类任务,将根据分类准确性(正确预测的标签百分比)评估您。 训练集有 1000 个样本,测试集有 9000 个样本。 您的预测应该是 9000 x 1 的 1 或 0 向量。您还需要一个 Id 列(1 到 9000),并且应该包含一个标题。

320BCC30.gif

2.数据处理

2.1观察

首先新打印一些数据的前五行,看看数据长什么样子:

print(df_train.head())

特征列的标题实在太长,显示列很少,没有观察到什么有用的信息,继续观察。

image-20231025090917946

再打印一下数据的简明摘要,显示数据的索引类型、列名、列数据类型、非空值数量,以了解数据的基本情况。

print(df_train.info())

image-20231025091056954

打印一下数据的基本统计信息,如百分比、均值、标准差等方法,如下图:

print(df_train.describe())

image-20231025102219882

我还想再看一下数据中存在哪些缺失值:

print(df_train.isnull().sum())

出乎意料🤪,我还是第一次遇到给出不存在缺失值的数据!这个题变得有意思起来了😜

image-20231025091724239

再看一下数据中是否有重复值。

print(df_train.nunique())

第一列表示每一列标题,第二列表示每一列中不一样的值,好家伙,每一列的值都不一样。

image-20231025092232472

print(df_train.nunique(axis=1))

第一列表示特征列标题,第二列表示每一行中不一样的值,好家伙,每一列的值都不一样。

image-20231025092507622

好好好,这写数据每一行,每一列都是不同的,真是越来越有意思了。😎继续玩下去。

320D1E72.jpg

似乎还给一个标签的表,也去看看这个表长什么样:

print(df_train_label.describe())

似乎这张表就是一张标签表,对train表格中的每一行打标签,0或1.

image-20231025175120214

现在对train、trainLabels、test(和train一样的操作就没有贴出来啦)数据都很清楚了,下面就开始数据化分析吧!

3.探索和可视化EDA

3.1制直方图以查看特征分布

我想通过直方图的去查看特征分布,目的是了解数据的形状、中心、范围和异常值。

fig = px.histogram(df_train)
fig.show()

40个特征还是有点东西的,颜色四十彩斑斓花里胡哨,但是仔细一点还是可以看出所有特征基本都是符合正态分布的。

Snipaste_2023-10-25_17-56-52

3.2制作箱线图查看数据的分布和异常值

plt.figure(figsize = (20,20))
for i in range (len(df_train.columns)):
    plt.subplot(5, 10, i+1)
    sns.boxplot(df_train.iloc[:,i])
    plt.xlabel(df_train.columns[i], size = 10)
plt.show()

画出所有特征列的箱线图,在画布上创建一个5*10的子图网格,使用sns.boxplot函数绘制当前列的箱线图。

Figure_1

箱线图是一种用于显示数据分布的图形,它可以显示数据的最小值、最大值、中位数、四分位数和异常值。

箱子在中位数两边对称,数据都是对称分布的,而且还可以观察到,箱子很长,即数据比较散。

3.3制作热力图查看特征之间的相关性

plt.figure(figsize = (20,20))
sns.heatmap(df_train.corr(), annot = True,cmap="YlOrRd",annot_kws={"size": 3})
plt.show()

热力图.png

观察上图,似乎数据间的相关性并不是很高,更多的是不呈相关性。

4 模型预测

这次的数据如此不同,异常数据没有,连缺省数据都没有,数据也不需要处理,那就多用几个模型预测吧,看看什么样的模型更适合这个数据。这次共选取6种模型进行预测📈。

先将train数据分割成训练集和测试集,按照7-3分。

x_train, x_test, y_train, y_test = train_test_split(train, trainLabels, test_size=0.30, random_state=101)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

分好的训练集和测试集如下所示:

image-20231026201254788

开始测试吧🤗

4.1 📉Logistic Regression 逻辑回归

逻辑回归是一种用来预测二元变量(如0或1)的概率的模型。

logistic_model = LogisticRegression()
logistic_model.fit(x_train, y_train.values.ravel())
l_predicted = logistic_model.predict(x_test)
print('Logistic Regression准确率:', accuracy_score(y_test, l_predicted))

image-20231026202555761

4.2 K-Nearest Neighbors KNN K-最邻近

K-最邻近是一种基于实例的模型,可以用来分类或回归。

K-最邻近的思想是根据一个新的数据点与已知的数据点的距离,找出最近的k个邻居,然后根据这些邻居的类别或数值进行投票或平均,得到新数据点的预测结果。

knn_model = KNeighborsClassifier()
knn_model.fit(x_train, y_train.values.ravel())
knn_predicted = knn_model.predict(x_test)
print('KNN model准确率:', accuracy_score(y_test, knn_predicted))

image-20231026203334616

4.3 Support Vector Machine SVM 支持向量机

支持向量机是一种非线性模型,可以用来分类或回归。

支持向量机的核心思想是通过一个核函数(如高斯核),将数据映射到一个高维空间,然后在这个空间中寻找一个超平面,使得不同类别的数据点之间的距离最大化。

svc_model = SVC(gamma='auto')
svc_model.fit(x_train, y_train.values.ravel())
svc_predicted = svc_model.predict(x_test)
print('SVM准确率:', accuracy_score(y_test, svc_predicted))

image-20231026203245864

4.4 🌲Random Forest RF 随机森林

随机森林是一种集成学习模型,可以用来分类或回归。

它的核心思想是通过构建多棵决策树,并让这些决策树对同一个数据点进行预测,然后根据这些决策树的预测结果进行投票或平均,得到最后的预测结果。

rforest_model = RandomForestClassifier()
rforest_model.fit(x_train, y_train.values.ravel())
rf_predicted = rforest_model.predict(x_test)
print('Random Forest准确率:', accuracy_score(y_test, rf_predicted))

image-20231026203303848

4.5 📐Extreme Gradient Boosting XGBoost 极致梯度提升

XGBoost就太熟悉了吧,上一篇文章还详细介绍过。

还是简单介绍一下吧。

XGBoost是一种集成学习模型,也是基于决策树的模型,但与随机森林不同的是,它是通过迭代地构建决策树,并让每一棵树对前面所有决策树预测结果的误差进行拟合,从而不断的提高预测精度。

xgb = XGBClassifier()
xgb.fit(x_train, y_train.values.ravel())
xgb_predicted = xgb.predict(x_test)
print('XGBoost准确率:', accuracy_score(y_test, xgb_predicted))

image-20231026203354345

4.6 😸Categorical Boosting CatBoost 分类梯度提升

CatBoost是一种集成学习模型,也可以用来分类或回归。与极致梯度提升类似,也是基于决策树的模型,但它的特点是能够很好的处理分类特征,而不需要对分类特征进行编码或转换。

cat = CatBoostClassifier()
cat.fit(x_train, y_train.values.ravel())
cat_predicted = cat.predict(x_test)
print('CatBoost准确率:', accuracy_score(y_test, cat_predicted))

image-20231026203413344

通过上面实验可以观察到,支持向量机模型对这组数据的预测准确率最高,达到了92.3%,其次是KNN和XGBoost均有87%的准确率。(题外话,XGBoost终于赢了CatBoost🥇)

320E4DEA.gif

4.7交叉验证

使用sklearn库中的cross_val_score函数来进行交叉验证,此函数可以对给定的模型和数据,使用指定的折数(cv参数)进行k折交叉验证,并返回准确率。

我在代码中对每个模型进行10折交叉验证,并打印出每个模型的平均交叉分数,目的是比较不同模型在同一数据集上的性能,并选择最优的模型。

norm = Normalizer()
norm_train = norm.fit_transform(train)

knn_model = KNeighborsClassifier(n_neighbors=5)
print('KNN', cross_val_score(knn_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

rfc_model = RandomForestClassifier(n_estimators=100, random_state=100)
print('Random Forest', cross_val_score(rfc_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

lr_model = LogisticRegression(solver='saga')
print('Logistic Regression', cross_val_score(lr_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

svc_model = SVC(gamma='auto')
print('SVM', cross_val_score(svc_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

xgb = XGBClassifier()
print('XGBoost', cross_val_score(xgb, norm_train, trainLabels.values.ravel(), cv=10).mean())

cat = CatBoostClassifier()
print('CatBoost', cross_val_score(cat, norm_train, trainLabels.values.ravel(), cv=10).mean())

image-20231026210517857

image-20231026210950213

观察到打印出的结果,CatBoost模型和KNN模型均以0.90的平均验证分数位居前列,CatBoost以微弱的优势暂居第一。其他模型的表现也很不错,均有0.80以上得分。✌

5 数据预测

通过上面的可视化探索,得到支持向量机和CatBoost模型两个模型的评分不错,接下来就用这两个模型都分别预测一下吧。

5.1支持向量机进行预测

print(train.shape, test.shape)
svc_model.fit(train, trainLabels.values.ravel())
svc_predicted = svc_model.predict(test)
svc_predicted = pd.DataFrame(svc_predicted)
svc_predicted.columns = ['Solution']
svc_predicted['Id'] = np.arange(1, len(svc_predicted) + 1)
svc_predicted = svc_predicted[['Id', 'Solution']]
svc_predicted.to_csv(r'C:\Users\19313\Desktop\其他\kaggle竞赛\伦敦数据科学+Scikit-learn\output_data\svc_predict.csv', index=False)

将用SVM模型预测得到的数据输出为csv文件,然后提交到kaggle上,得分是0.913,分数应该还不错,但是我不知道排名,因为这个比赛已经结束了。

image-20231026221550181

5.2CatBoost进行预测

cat.fit(train, trainLabels.values.ravel())
cat_predicted = cat.predict(test)
cat_predicted = pd.DataFrame(cat_predicted)
cat_predicted.columns = ['Solution']
cat_predicted['Id'] = np.arange(1, cat_predicted.shape[0] + 1)
cat_predicted = cat_predicted[['Id', 'Solution']]
cat_predicted.to_csv(r'C:\Users\19313\Desktop\其他\kaggle竞赛\伦敦数据科学+Scikit-learn\output_data\cat_predict.csv', index=False)

同上,将CatBoost模型预测得到的数据也提交,得分为0.895,比向量机的得分要低一些。这两个还是SVM更胜一筹呀😎

image-20231026221843303

这个比赛也完成了,总的来说,这次的数据是非常神奇的。比如说,没有缺失数据,没有异常数据,没有表头(我在这个点上栽了好大一个跟头😩),不过总体还是很有意思的。

320E9FE2.jpg

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值