- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 。
今天我们将结合第一章节中清洗得到的菜品数据,利用多种分类器对这些数据进行训练,以构建有效的模型。在这个过程中,我会详细讲解每一种分类器的原理及其重要性.
尽管这些知识点对于实践来说并不是必须掌握的,因为第三方依赖包已经为我们完成了大量的封装,使得调用这些功能仅需一行代码,但理解其背后的原理仍然至关重要。这将有助于我们在实际应用中更好地把握模型的表现和改进的方向.
在上一章节中,我们已经查看了微软的小抄表,并对其进行了中文翻译,希望这些内容对你有所帮助。今天,我们将继续探索Scikit-learn提供的一个类似的速查表,但它的细粒度和信息量更加丰富。这份速查表不仅能帮助您快速查找相关信息,还能为您在调整估计器(分类器的另一个术语)时提供实用的指导.
速查表原文地址:https://scikit-learn.org/stable/machine_learning_map.html 。
表情😭符号应理解为“如果此估计器没有达到预期结果,则按照箭头尝试下一个” 。
然后,我们根据此路线图选择我们的分类器:
接下来第一步则是将数据分为训练集、测试集.
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
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
import numpy as np
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_label_df = cuisines_df['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)
根据我们的学习路线图,第一步我们需要尝试线性SVC分类器。在深入讲解SVC之前,我们有必要先了解一下支持向量机(SVM)。这是因为在你搜索SVC时,通常会找到大量关于SVM的资料,所以理解这两者之间的区别是十分重要的.
接下来,我们将探讨这两者的不同之处,以及它们各自的特点和应用场景,以便为后续的学习奠定更扎实的基础.
支持向量机是一种强大的监督学习算法,用于分类和回归问题。SVM是一个广泛的概念,涵盖了分类和回归问题;而SVC是SVM的特定应用,专门用于分类任务。在机器学习库中,SVC通常是实现SVM的分类器的名称,比如在Scikit-learn库中.
支持向量机(SVM)有几个子类,主要包括:支持向量分类(SVC)、支持向量回归(SVR)、一类支持向量机(One-Class SVM)、 多类支持向量机(Multi-Class SVM)、概率支持向量机(Probabilistic SVM)。这些子类允许支持向量机在不同类型的任务中表现出色。每个子类都有其独特的实现和优化方式,以适应特定的应用场景.
如果理解线性 SVC 有些困难,我们来举一个例子:
想象你在一个学校,有两个班级:数学班和艺术班。每个学生都有不同的特点,比如他们的数学成绩和艺术成绩。你想根据这两个成绩把学生分到这两个班级.
通过这个比喻,SVC的核心就是:
为此我找了一张图片说明一下,更容易让你理解。H3则是最佳分界线.
让我们直接来看一下代码。尽管实现了如此复杂的功能,代码的结构却相对简单明了.
C = 10
# 创建不同的分类器
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
n_classifiers = len(classifiers)
for index, (name, classifier) in enumerate(classifiers.items()):
classifier.fit(X_train, np.ravel(y_train))
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
print(classification_report(y_test,y_pred))
运行结果如下,从表面上看,性能表现相当不错,准确率至少接近80%.
Accuracy (train) for Linear SVC: 78.7%
precision recall f1-score support
chinese 0.69 0.80 0.74 242
indian 0.89 0.84 0.87 239
japanese 0.73 0.71 0.72 223
korean 0.90 0.75 0.82 250
thai 0.76 0.83 0.79 245
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.80 0.79 0.79 1199
K-近邻分类器(K-Nearest Neighbors, KNN)是一种简单且直观的监督学习算法,主要用于分类和回归任务。它的基本思想是通过计算数据点之间的距离,将待分类的数据点归类到其最近的 K 个邻居的类别中.
在社交网络中,我们常常能看到某些用户与特定兴趣群体的联系。比如,假设我们想要判断一个新用户的兴趣所在,我们可以观察他周围的朋友.
当我们分析这个新用户的社交网络时,可以查看与他最亲近的 K 个朋友。这些朋友的共同兴趣和活动可以为我们提供线索。如果这 K 个朋友大多数都喜欢摄影,那么我们可以推测,这位新用户很可能也对摄影感兴趣.
通过这种方式,我们利用社交网络中朋友的影响,判断一个用户的兴趣和爱好,从而更好地为他推荐内容和连接.
也就是说,根据近邻样本推测当前数据点属于哪一类.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),
'KNN classifier': KNeighborsClassifier(C),
}
其他代码无需修改,我们只需在分类对象中添加一个 KNN 分类器即可。接下来,我们将继续观察运行结果。值得注意的是,这一调整并未产生显著的效果,KNN 分类器的引入似乎对模型的整体性能没有带来太大的提升.
Accuracy (train) for KNN classifier: 74.1%
precision recall f1-score support
chinese 0.70 0.76 0.73 242
indian 0.88 0.78 0.83 239
japanese 0.64 0.82 0.72 223
korean 0.94 0.54 0.68 250
thai 0.68 0.82 0.74 245
accuracy 0.74 1199
macro avg 0.77 0.74 0.74 1199
weighted avg 0.77 0.74 0.74 1199
支持向量分类(SVC)和线性支持向量分类(Linear SVC)都是支持向量机(SVM)的一种实现,但它们在一些关键方面存在区别:
如果你知道数据是线性可分的或者特征维数非常高,使用 Linear SVC 可能更高效。如果数据存在非线性关系,选择 SVC 并使用适当的核函数更合适.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),
'KNN classifier': KNeighborsClassifier(C),
'SVC': SVC(),
}
我们将继续观察SVC的运行结果,似乎表现得更为理想.
Accuracy (train) for SVC: 81.7%
precision recall f1-score support
chinese 0.73 0.82 0.77 242
indian 0.89 0.90 0.89 239
japanese 0.81 0.73 0.76 223
korean 0.90 0.77 0.83 250
thai 0.79 0.86 0.82 245
accuracy 0.82 1199
macro avg 0.82 0.82 0.82 1199
weighted avg 0.82 0.82 0.82 1199
尽管之前的测试结果已经相当令人满意,但为了确保我们能够全面评估模型的性能,我们决定沿着既定路线走到最后。因此,我们将尝试一些集成分类器,特别是随机森林和AdaBoost.
随机森林就是用很多棵决策树来做判断,通过随机选择样本和特征来确保多样性,最后结合这些树的结果来提高整体的准确性和稳定性。这样的方法让模型更可靠,也更能适应复杂的数据.
想象一下,你想要决定今天的午餐吃什么,但你有很多朋友,每个朋友都有不同的口味。你可以做以下几件事:
关键知识点 。
AdaBoost 的核心思想是通过不断学习和调整,结合多个弱分类器的力量,来提高整体的预测能力。每次迭代都关注之前的错误,从而使模型逐步改进.
想象一下,你在学校里参加一个辩论比赛,但你是个初学者,可能不太擅长辩论。你决定请教一些同学,他们的辩论水平不同,有的很厉害,有的刚刚开始.
关键知识点 。
随机森林:每棵树都是相对独立的,组合后形成的模型通常更稳健,尤其在数据集比较复杂时,随机森林的每棵树之间的相关性较低,有助于减少方差,通常在特征数量很大或数据集复杂时表现良好,适用于分类和回归任务.
AdaBoost:分类器是串行的,每个新分类器都依赖于前一个分类器的结果,建立在前一个模型的基础上,AdaBoost 更容易受到噪声数据的影响,因为它会对错误分类的样本给予更高的关注。更适合处理一些简单的、需要更高准确性的任务,尤其在面对数据噪声较少的情况下.
随机森林更注重多样性和独立性,而 AdaBoost 则通过聚焦于难点来提升整体性能.
接下来,对于我们实现的代码来说就是两行代码:
# 创建不同的分类器
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),
'KNN classifier': KNeighborsClassifier(C),
'SVC': SVC(),
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
}
n_estimators在随机森林中表示将生成 100 棵决策树。每棵树都是通过随机选择样本和特征来训练的。通过增加树的数量,模型的表现通常会更稳定,且更不容易过拟合.
n_estimators在AdaBoost 这表示将创建 100 个弱分类器(通常是简单的决策树)。每个分类器都会基于前一个分类器的表现进行训练,关注那些之前分类错误的样本。增加分类器的数量通常能提高模型的表现,但也可能增加过拟合的风险.
运行结果如下:
Accuracy (train) for RFST: 83.4%
precision recall f1-score support
chinese 0.78 0.80 0.79 242
indian 0.89 0.91 0.90 239
japanese 0.81 0.78 0.80 223
korean 0.89 0.81 0.85 250
thai 0.80 0.87 0.83 245
accuracy 0.83 1199
macro avg 0.83 0.83 0.83 1199
weighted avg 0.84 0.83 0.83 1199
Accuracy (train) for ADA: 69.5%
precision recall f1-score support
chinese 0.66 0.48 0.56 242
indian 0.88 0.79 0.84 239
japanese 0.66 0.64 0.65 223
korean 0.67 0.73 0.70 250
thai 0.64 0.82 0.72 245
accuracy 0.69 1199
macro avg 0.70 0.69 0.69 1199
weighted avg 0.70 0.69 0.69 1199
到此为止,我们已经对整个路线图中能够应用的所有分类器进行了全面的研究。虽然在代码实现上,这可能仅仅涉及一行代码或几个参数的调整,但在背后,我们仍需对这些模型的基本逻辑和原理有一个大致的理解.
在这个学习旅程中,我们不仅深入探讨了各类分类器的原理和应用,还通过实践加深了对模型构建过程的理解。通过使用不同的算法,如线性SVC、K-近邻分类器、支持向量分类器及集成方法如随机森林和AdaBoost,我们看到了数据处理和模型训练的多样性。在每一步的探索中,我们不仅关注了准确率,还思考了每种算法的适用场景及其优势。虽然使用机器学习库简化了实现的复杂性,但背后每个模型的逻辑与机制依然是值得我们深入了解的重要内容.
此外,我们学习到,模型的性能不仅依赖于选择的算法,还与数据的特性、预处理的质量和参数的调优紧密相关。面对不同的数据集,灵活地选择适合的分类器和调整其参数,是提升模型效果的关键。通过使用Scikit-learn的速查表,我们能够快速定位到合适的算法,为实际应用提供了有效的指导.
当然,最后我也想鼓励大家去看看这个学习平台,它非常适合新手,提供了丰富的资源和易于理解的教程.
我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者.
💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助.
🌟 欢迎关注努力的小雨!🌟 。
最后此篇关于从零开始学机器学习——分类器详解的文章就讲到这里了,如果你想了解更多关于从零开始学机器学习——分类器详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在对一款流行游戏 (Minecraft) 进行一些修改,我在地形生成中看到了这些线条, double d4 = 1.0D; d4 *= d4; d4 *= d4; d4 = 1.0D - d4;
如何在没有浮点单元的处理器上执行 float 学运算?例如低端 8 位微 Controller 。 最佳答案 看看这篇文章:http://www.edwardrosten.com/code/fp_te
抱歉这个冗长的标题。我的代码针对没有浮点单元的微 Controller (msp430),但这应该适用于任何类似的 MCU。 如果我将一个大的运行时变量与通常被认为是浮点十进制数 (1.8) 相乘,M
我偶尔会在这个方法中遇到 stackoverflow 异常。 double norm_cdf(const double x) { double k = 1.0/(1.0 + 0.2316419
这是一个让我在过去几个小时里完全困惑的问题...... 我的程序中有一个硬编码的方程式: double s2; s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 每
我知道 float 学充其量是丑陋的,但我想知道是否有人可以解释以下怪癖。在我测试的大多数编程语言中,将 0.4 添加到 0.2 会产生轻微错误,而 0.4 + 0.1 + 0.1 则不会。 两者计算
随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。 因此,Stratascratch的创始人Nathan Rosidi以及我觉
当使用 c++ 或 -O0 编译时,以下 -O1 程序给出了数值不同的结果。 #include #include #include #include int main() { std::a
我正在尝试使用 SVG 在 map 上绘制飞行路径。我在 Leaflet 之上使用 d3,但所使用的框架不会对我的问题产生影响 - 这是三 Angular 关系。 http://fiddle.jshe
使用 IEEE754 float (在 JavaScript 中)时,与数学相关的精度损失风险是什么? 10*.1 即整数乘以有理数。 最佳答案 注意:该问题经过编辑,在发布此答案后很长时间添加了“t
我需要为网站 UI 做一些基本的 float 学运算(金钱的加法和乘法)。我知道 Javascript float 由于存储方式的原因并不准确,但我也知道以某种方式,可以获得我所需的准确度。我知道这一
我有一些像下面这样的宏: #define THING_LENGTH (512) #define MAX_COUNT (4096*8) #define MAX_LENGTH ((int32)((floa
我认为这是一个非常基本的问题 - 我正在执行此功能: private double convertMetersToFeet(double meters) { //function converts
我想在不损失太多精度的情况下替换这些函数中的 float 学,因为我没有 FPU。这可能吗?我认为逗号后的 3 个数字就足够了。 inline float smaller_f(float value,
我需要一个类来表示 double vector (在数学意义上)。 我需要的特殊功能: 任意维度 vector (我通常使用 10 - 100,000 维度) 高性能(用于受 CPU 限制的数字代码)
此社区 Wiki 问题的公认答案:What are best practices that you use when writing Objective-C and Cocoa?说 iPhone 不能
This question already has an answer here: Trouble with float on C [duplicate]
以下代码有问题: private const int movementMultiplier = 2; void Test() { XmlNode xnXCoordinate = xd.Sele
大家早上好 我在 float 学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中! 我希望有人能帮助我解决我的具体问题,并准确解释他们的解决方案为何有效,以便我下次理解这一点。
我的嵌入式 C 代码在具有单精度 FPU 的 Cortex M4F 上运行。我担心编译器多久将基于软件的 double 学放在诸如 ** float_var1 = 3.0 * int_var / fl
我是一名优秀的程序员,十分优秀!