一文读懂机器学习分类全流程_平衡数据集(1),2024年最新蚂蚁金服Golang架构面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

①导入Python第三方库

②调用并查看数据

2.查看数据分布

①各国样本分布直方图

②各国样本划分

3.各国最受欢迎食材可视化

4.平衡数据集

①样本插值采样

三、分类器选择

四、逻辑回归模型构建

1.数据导入及查看

2.可训练特征与预测标签选择及数据集划分

3.构建逻辑回归模型及精度评价

4.模型测试

五、更多分类模型

1.第三方库导入

2.测试不同分类器

①线性SVC分类器

②K-近邻分类器

③SVM分类器

④集成分类器

六、模型发布为Web应用

1.模型打包

2.配置Flask应用

②app.py

3.应用运行及测试

结论


前言

在本文中,你将学到:

0 复习数据预处理及可视化

1 了解分类的基本概念

2 使用多种分类器来对比模型精度

3 掌握使用分类器列表的方式来批处理不同模型

4 将机器学习分类模型部署为Web应用

提出问题

本文我们所用的数据集是亚洲美食数据集,其包括了亚洲5个国家的美食食谱与所属的国家。我们构建模型的目的是解决:

如何根据美食所用食材判断其所属国家

以美食食材为可训练特征,所属国家为预测标签构建机器学习分类模型。

一、介绍

1.分类简介

分类是经典机器学习的基本重点,也是监督学习的一种形式,与回归技术有很多共同之处。其通常分为两类:二元分类和多元分类。本文中,我将使用亚洲美食数据集贯穿本次学习。

还记得我在之前文章中提到的:

0 线性回归可帮助我们预测变量之间的关系,并准确预测新数据点相对于该线的位置。因此,例如,预测南瓜在9月与12月的价格。

1 Logistic回归帮助我们发现“二元类别”:在这个价格点上,这是橙子还是非橙子?

分类也是机器学习人员和数据科学家的基本工作之一。从二分类(判断邮件是否是垃圾邮件),到使用计算机视觉的复杂分类和分割,其在很多领域都有着很大的作用。

以更科学的方式陈述该过程:

我们所使用的分类方法创建了一个预测模型,这个模型使我们能够将输入变量之间的关系映射到输出变量。

670725bb7b904a1badb0eb98183251f8.png

分类使用各种算法来确定数据点的标签或类别。我们以亚洲美食数据集为例,看看通过输入一组特征样本,我们是否可以确定其菜肴所属的国家。

以下是经典机器学习常用的分类方法。

0 逻辑回归

1 决策树分类(ID3、C4.5、CART)

2 基于规则分类

3 K-近邻算法(K-NN)

4 贝叶斯分类

5 支持向量机(SVM)

6 随机森林(Random Forest)

2.imblearn的安装

在开始本文学习之前,我们第一个任务是清理和调整数据集以获得更好的分析结果。我们需要安装的是imblearn库。这是一个基于Python的Scikit-learn软件包,它可以让我们更好地平衡数据。

在命令行中输入以下代码,使用阿里的镜像来安装 imblearn

pip install -i https://mirrors.aliyun.com/pypi/simple/ imblearn

看到如下图所示代表安装成功。

9f8e99e936714211aba6d1b4194972e9.png

二、数据加载及预处理

1.加载并查看数据

①导入Python第三方库

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE

②调用并查看数据

df = pd.read_csv(‘cuisines.csv’)
df.head()

前5行数据如下图所示:

4db9405c915d4e618a7335e356fb9579.png

查看数据结构:

df.info()

aad8d10e36654b628a69c1a7ab67602b.png

通过查看数据与其组织结构,我们可以发现数据有2448行,385列,其中有大量的无效数据。

2.查看数据分布

我们可以对数据进行可视化来发现数据集中的数据分布。

①各国样本分布直方图

通过调用barh()函数将数据绘制为柱状图。

df.cuisine.value_counts().plot.barh() #根据不同国家对数据集进行划分

结果如下:

f5a7565988fc451bb171128b5e1800e0.png

我们可以看到,数据集中以韩国料理样本最多,泰国样本最少。美食的数量有限,但数据的分布是不均匀的。我们可以解决这个问题!在此之前,请进一步探索。

②各国样本划分

了解各国美食有多少可用数据并将其打印输出。输入以下代码,从结果中我们可以看到不同国家美食的可用数据:

thai_df = df[(df.cuisine == “thai”)]#提取泰国美食
japanese_df = df[(df.cuisine == “japanese”)]#提取日本美食
chinese_df = df[(df.cuisine == “chinese”)]#提取中国美食
indian_df = df[(df.cuisine == “indian”)]#提取印度美食
korean_df = df[(df.cuisine == “korean”)]#提取韩国美食
print(f’thai df: {thai_df.shape}‘)#输出数据结构
print(f’japanese df: {japanese_df.shape}’)#输出数据结构
print(f’chinese df: {chinese_df.shape}‘)#输出数据结构
print(f’indian df: {indian_df.shape}’)#输出数据结构
print(f’korean df: {korean_df.shape}')#输出数据结构

37a7a5b8f2d54363a3e1fdc109ba7543.png

3.各国最受欢迎食材可视化

现在,我们可以更深入的挖掘数据,并了解每种菜肴的成分。在此之前,我们应该对数据进行预处理,删去重复值。

在python中创建一个函数来删除无用的列,然后按成分数量进行排序。

def create_ingredient_df(df):
ingredient_df = df.T.drop([‘cuisine’,‘Unnamed: 0’]).sum(axis=1).to_frame(‘value’)#从原始数据中删除无效列并统计axis=1的总和赋值给value列
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]#提取所有非0值的样本
ingredient_df = ingredient_df.sort_values(by=‘value’, ascending=False,
inplace=False)#按照数值的大小进行排序
return ingredient_df#返回处理并排序后的结果

现在,我们调用create_ingredient_df()函数来了解泰国美食中,最受欢迎的十大食材。输入以下代码:

thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()

查看泰国美食中十大最受欢迎的食材:

016773948d374a64b73075572a82738c.png

我们可以看到,第一名的食材是garlic(大蒜),第十名则是chicken(鸡肉)。

对中国数据执行同样的操作:

chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()

结果如下,中国美食食材中,最受欢迎的是soy_sauce(酱油),第十名是cayenne(红辣椒):

4d606c93c827479787918d483fd9aca9.png

同理,我们也可以输出其他国家的美食食材,这里就不水文了。大家可自行尝试。

现在,我们需要使用drop()函数删除不同美食间造成混淆的最常见成分以突出各国食材的特色,每个国家的人都喜欢米饭、大蒜和生姜。(可自行可视化查看),我们输入以下代码将其删去。

feature_df= df.drop([‘cuisine’,‘Unnamed: 0’,‘rice’,‘garlic’,‘ginger’], axis=1)#删去最常见的这几列以平衡不同国家之间的混淆
labels_df = df.cuisine

4.平衡数据集

现在我们已经清理了数据,因为不同国家的样本数量差异较大,我们需要使用SMOTE(“合成少数过度采样技术”)来平衡它。

SMOTE介绍

①样本插值采样

调用SMOTE对象的 **fit_resample()**函数来插值重采样生成新样本。输入以下代码:

oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
print(f’new label count: {transformed_label_df.value_counts()}‘)
print(f’old label count: {df.cuisine.value_counts()}’)

查看新样本与旧样本的数据量差异:

53fd56e6e4514e8db52bce861f874eeb.png

我们可以看到,新样本不同类别标签下的样本数量都在799,它是以旧样本中最大样本量标签为基础构建的,而旧样本则参差不齐,分布不均匀。

数据质量很好,干净、平衡!🧸🧸

数据预处理的最后一步是将预处理后的数据导出以后直接调用。输入以下代码:

transformed_df.to_csv(“cleaned_cuisines.csv”)#保存至新文件方便下一次直接调用

三、分类器选择

现在,数据已经经过预处理,我们可以构建分类模型了!

但是选择什么模型好呢?

Scikit-learn中的分类算法在监督学习下,在该类别中,我们将找到许多分类方法。这种多样性一见钟情就相当令人眼花缭乱。以下方法都包含分类技术:

线性模型

支持向量机

随机梯度下降

最近邻

高斯过程

决策树

集成学习(随机森林)

多类和多输出算法(多类和多标签分类、多类-多输出分类)

使用什么分类器?

通常,同时运行几个分类模型,最终找到精度最高的方法很常用。Scikit-learn提供了对所创建数据集的并列比较,比较了下面模型的结果。

KNeighbors,SVC,GaussianProcessClassifier,DecisionTreeClassifier,RandomForestClassifier,MLPClassifier,AdaBoostClassifier,GaussianNB和QuadraticDiscrinationAnalysis

下图显示了这些模型可视化的结果:

ea2a88fe5d1b4a7a99c7b9ae0ffcee17.png

这种方法在数据集样本较少时可以使用,但随着样本数量的增多,这对计算的负担将会越来越大。我们先不考虑这种方法。请继续向下看😀。

四、逻辑回归模型构建

前文中,我们已经对数据进行了预处理,方便起见,我们在后续文章中直接调用经过预处理的 cleaned_cuisines.csv 文件。

我们在之前的逻辑回归文章中,有学到逻辑回归的基本原理与构建流程,这里我们可以尝试使用逻辑回归来解决问题。

1.数据导入及查看

导入第三方库并加载经过预处理的数据cleaned_cuisines.csv。输入以下代码:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
import pandas as pd
cuisines_df = pd.read_csv(“cleaned_cuisines.csv”)
print(cuisines_df.info())
cuisines_df.head()

数据如下图所示:

965d7868479f42289347eee320ecd678.png

2.可训练特征与预测标签选择及数据集划分

以美食数据集的所属国家列为预测标签Y,食材为可训练特征构建数据集。并以7:3的比例划分训练集与测试集。输入以下代码:

cuisines_label_df = cuisines_df[‘cuisine’] #以cuisine列为预测标签
cuisines_feature_df = cuisines_df.drop([‘Unnamed: 0’, ‘cuisine’], axis=1) #删去无用的列,取食材列为可训练特征
X_train, X_test, Y_train, Y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)#以7:3比例划分训练集与测试集

3.构建逻辑回归模型及精度评价

使用划分好的数据集进行逻辑回归模型构建,打印出模型的精度评价表;测试模型的预测效果。输入以下代码:

lr = LogisticRegression(multi_class=‘ovr’,solver=‘liblinear’)
model = lr.fit(X_train, np.ravel(Y_train))

accuracy = model.score(X_test, Y_test)
print (“Accuracy is {}”.format(accuracy))
Y_pred = model.predict(X_test)
print(classification_report(Y_test,Y_pred))

输出结果为ACC系数为:79.1%

通过打印出该模型的精度评价表我们可以获得更多的模型信息:

cde6a3492cd543a5b9a29c82621a889b.png

4.模型测试

测试模型并查看模型在测试集上将样本分类为不同类别的概率:

print(f’ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}‘)
print(f’cuisine: {Y_test.iloc[50]}’)
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()

输出结果为:

7472a5308fd0484ea4192b3333cdfbd8.png

可以看到对于测试集上的某个样本,其预测为日本菜的概率为91%。

五、更多分类模型

在前文中,我们已经构建了逻辑回归模型,那么可以使用其他模型吗,怎么选择呢?

在开始选择分类器之前,我要向各位读者推荐一个机器学习神器----分类地图

Scikit-learn提供了一个机器学习分类器选择的地图,它可以进一步帮助使用者缩小分类器的选择范围,如下图:

cf885a147f834f6d8ff96dc9f8077db1.png

一旦我们对数据有了一定的了解,此地图将极大的节省我们的试错成本,因为我们可以沿着其路径“行走”来选择需要的模型(看着图走):

0 我们有大于50个样本

1 我们想要预测一个类别

2 我们标记了数据

3 我们的样本少于100K

4 我们可以选择线性SVC

5 如果这不起作用,因为我们有数字数据

6 我们可以尝试 KNeighbors Classifier

7 如果这不起作用,请尝试 SVC 和 集成分类器(诸如随机森林)

这是一条非常有用的工具,对机器学习初学者很友好。

1.第三方库导入

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
学习分类器选择的地图,它可以进一步帮助使用者缩小分类器的选择范围,如下图:

cf885a147f834f6d8ff96dc9f8077db1.png

一旦我们对数据有了一定的了解,此地图将极大的节省我们的试错成本,因为我们可以沿着其路径“行走”来选择需要的模型(看着图走):

0 我们有大于50个样本

1 我们想要预测一个类别

2 我们标记了数据

3 我们的样本少于100K

4 我们可以选择线性SVC

5 如果这不起作用,因为我们有数字数据

6 我们可以尝试 KNeighbors Classifier

7 如果这不起作用,请尝试 SVC 和 集成分类器(诸如随机森林)

这是一条非常有用的工具,对机器学习初学者很友好。

1.第三方库导入

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-jP9TDKWW-1713448781054)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值