讲完随机森林算法之后,小冰开口问道 :“咖哥,上面的这几种经典算法,你讲得简明扼要,感觉都挺好。不过,现在的问题来了,算法一多,我反而不知道如何选择了。你能不能给我们说说,什么样的算法适合解决什么样的问题?”

咖哥回答 :“这很值得说一说。没有任何一种机器学习算法,能够做到针对任何数据集都是最佳的。通常,拿到一个具体的数据集后,会根据一系列的考量因素进行评估。这些因素包括 :要解决的问题的性质、数据集大小、数据集特征、有无标签等。有了这些信息后,再来寻找适宜的算法。”

让我们从下页这张 Sklearn 的算法“官方小抄”图入手来简单说说机器学习算法的选择。顺着这张图过一遍各种机器学习算法,也是一个令我们将所学知识融会贯通的过程。

在开始选择 Sklearn 算法之前,先额外加一个 IF 语句 :

IF 机器学习问题 = 感知类问题 ( 也就是图像、语言、文本等非结构化问题 )THEN 深度学习算法 ( 例如使用 Keras 深度学习库 )

因为适合深度学习的问题通常不用 Sklearn 库来解决,而对于浅层的机器学习问题,Sklearn就可以大显身手了。Sklearn 库中的算法选择流程如下 :

IF 数据量小于 50 个
数据样本太少了 , 先获取更多数据
ELSE 数据量大于 50 个IF 是分类问题IF 数据有标签IF 数据量小于 10 万个
选择 SGD 分类器ELSE 数据量大于 10 万个
先尝试线性 SVM 分类器 , 如果不好用 , 再继续尝试其他算法IF 特征为文本数据
选择朴素贝叶斯ELSE
先尝试 KNN 分类器 , 如果不好用 , 再尝试 SVM 分类器加集成分类算法 ( 参见第 9 课内容 )ELSE 数据没有标签
选择各种聚类算法 ( 参见第 10 课内容 )ELSE 不是分类问题IF 需要预测数值 , 就是回归问题IF 数据量大于 10 万个
选择 SGD 回归ELSE 数据量小于 10 万个
根据数据集特征的特点 , 有套索回归和岭回归、集成回归算法、SVM 回归等几种选择ELSE 进行可视化 ,
则考虑几种降维算法 ( 参见第 10 课内容 )ELSE 预测结构
对不起 , Sklearn 帮不了你

选择机器学习算法的思路大致如此。此外,经验和直觉在机器学习领域的重要性当然是不言而喻。其实,不光机器学习,经验和直觉无论在什么领域也都是关键。当然,选取多种算法去解决同一个问题,然后将各种算法的效率进行比较,也不失为一个好的方案。

刚才,我们已经应用了好几个机器学习算法处理同一个数据集。再加上以前讲过的逻辑回归,现在就可以对各种算法的性能进行一个横向比较。下面是用逻辑回归算法解决心脏病的预测问题的示例代码。

from sklearn.linear_model import LogisticRegression # 导入逻辑回归模型
lr = LogisticRegression()
lr.fifit(X_train, y_train)
y_pred = lr.predict(X_test) # 预测心脏病结果
lr_acc = lr.score(X_test, y_test)*100
lr_f1 = f1_score(y_test, y_pred)*100
print(" 逻辑回归预测准确率 :{:.2f}%".format(lr_acc))
print(" 逻辑回归预测 F1 分数 : {:.2f}%".format(lr_f1))
print(' 逻辑回归混淆矩阵 :\n', confusion_matrix(y_test, y_pred))

下面就输出所有这些算法针对心脏病预测的准确率直方图 :

methods = ["Logistic Regression", "KNN", "SVM","Naive Bayes", "Decision Tree", "Random Forest"]
accuracy = [lr_acc, KNN_acc, svm_acc, nb_acc, dtc_acc, rf_acc]
colors = ["orange", "red", "purple", "magenta", "green", "blue"]
sns.set_style("whitegrid")
plt.fifigure(fifigsize=(16, 5))
plt.yticks(np.arange(0, 100, 10))
plt.ylabel("Accuracy %")
plt.xlabel("Algorithms")
sns.barplot(x=methods, y=accuracy, palette=colors)
plt.grid(b=None)
plt.show()

各种算法的准确率比较如下图所示。

从结果上看,KNN 和随机森林等算法对于这个问题来说是较好的算法。

再绘制出各种算法的混淆矩阵 :

# 绘制出各种算法的混淆矩阵
from sklearn.metrics import confusion_matrix
y_pred_lr = lr.predict(X_test)
KNN3 = KNeighborsClassififier(n_neighbors = 3)
KNN3.fifit(X_train, y_train)
y_pred_KNN = KNN3.predict(X_test)
y_pred_svm = svm.predict(X_test)
y_pred_nb = nb.predict(X_test)
y_pred_dtc = dtc.predict(X_test)
y_pred_rf = rf.predict(X_test)
cm_lr = confusion_matrix(y_test, y_pred_lr)
cm_KNN = confusion_matrix(y_test, y_pred_KNN)
cm_svm = confusion_matrix(y_test, y_pred_svm)
cm_nb = confusion_matrix(y_test, y_pred_nb)
cm_dtc = confusion_matrix(y_test, y_pred_dtc)
cm_rf = confusion_matrix(y_test, y_pred_rf)
plt.figure(figsize=(24, 12))
plt.suptitle("Confusion Matrixes", fontsize=24) # 混淆矩阵
plt.subplots_adjust(wspace = 0.4, hspace= 0.4)
plt.subplot(2, 3, 1)
plt.title("Logistic Regression Confusion Matrix") # 逻辑回归混淆矩阵
sns.heatmap(cm_lr, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.subplot(2, 3, 2)
plt.title("K Nearest Neighbors Confusion Matrix") #KNN 混淆矩阵
sns.heatmap(cm_KNN, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.subplot(2, 3, 3)
plt.title("Support Vector Machine Confusion Matrix") #SVM 混淆矩阵
sns.heatmap(cm_svm, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.subplot(2, 3, 4)
plt.title("Naive Bayes Confusion Matrix") # 朴素贝叶斯混淆矩阵
sns.heatmap(cm_nb, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.subplot(2, 3, 5)
plt.title("Decision Tree Classifier Confusion Matrix") # 决策树混淆矩阵
sns.heatmap(cm_dtc, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.subplot(2, 3, 6)
plt.title("Random Forest Confusion Matrix") # 随机森林混淆矩阵
sns.heatmap(cm_rf, annot=True, cmap="Blues", fmt="d", cbar=False)
plt.show()

各种算法的混淆矩阵如下图所示。

从图中可以看出,KNN 和随机森林这两种算法中“假负”的数目为 3,也就是说本来没有心脏病,却判定为有心脏病的客户有 3 人 ;而“假正”的数目为 4,也就是说本来有心脏病,判定为没有心脏病的客户有 4 人。

本文摘自《零基础学机器学习》


机器学习,就是在已知数据集的基础上,通过反复的计算,选择最贴切的函数(function)去描述数据集中自变量x1, x 2, x 3, …, xn 和因变量y 之间的关系。如果机器通过所谓的训练(training)找到了一个函数,对于已有的 1000 组钻石数据,它都能够根据钻石的各种特征,大致推断出其价格。那么,再给另一批同类钻石的大小、重量、颜色、密度等数据,就很有希望用同样的函数(模型)推断出这另一批钻石的价格。此时,已有的 1000 组有价格的钻石数据,就叫作训练数据集(trainingdataset)。另一批钻石数据,就叫作测试数据集(test dataset)。

因此,正如下图所示,通过机器学习模型不仅可以推测孩子身高和钻石价格,还可以实现影片票房预测、人脸识别、根据当前场景控制游戏角色的动作等诸多功能。

机器学习就是从数据中发现关系,归纳成函数,以实现从 A 到 B 的推断

其实所谓机器学习,的确是一个统计建模的过程。但是当特征数目和数据量大到百万、千万,甚至上亿时,原本属于数学家的工作当然只能通过机器来完成喽。而且,机器学习没有抽样的习惯,对于机器来说,数据是多多益善,有多少就用多少。

下面的图展示了机器从数据中训练模型的过程,而人类的学习,是从经验中归纳规律,两者何其相似!越是与人类学习方式相似的 AI,才是越高级的 AI !这种从已知到未知的学习能力是机器学习和以前的符号式 AI 最本质的区别。

机器 :从数据中学习 ;人类 :从经验中学习。两者何其相似

机器学习的另外一个特质是从错误中学习,这一点也与人类的学习方式非常相似。你们看一个婴儿,他总想吞掉他能够拿到的任何东西,包括硬币和纽扣,但是真的吃到嘴里,会发生不好的结果。慢慢地,他就从这些错误经验中学习到什么能吃,什么不能吃。这是通过试错来积累经验。机器学习的训练、建模的过程和人类的这个试错式学习过程有些相似。机器找到一个函数去拟合(fit)它要解决的问题,如果错误比较严重,它就放弃,再找到一个函数,

如果错误还是比较严重,就再找,一直到找到相对最为合适的函数为止,此时犯错误的概率最小。这个寻找的过程,绝大多数情况不是在人类的“指导”下进行的,而是机器通过机器学习算法自己摸索出来的。

因此,机器学习是突破传统的学习范式,它与专家系统(属于符号式 AI)中的规则定义不同。如下图所示,它不是由人类把已知的规则定义好之后输入给机器的,而是机器从已知数据中不断试错之后,归纳出来规则。

机器学习是突破传统的学习范式,是从数据中发现规则,而不是接受人类为它设定的规则

如果你想学习机器学习,以上内容您很感兴趣。那么推荐您阅读《零基础学机器学习

本书的目标,是让非机器学习领域甚至非计算机专业出身但有学习需求的人,轻松地掌握机器学习的基本知识,从而拥有相关的实战能力。

本书通过AI“小白”小冰拜师程序员咖哥学习机器学习的对话展开,内容轻松,实战性强,主要包括机器学习快速上手路径、数学和Python 基础知识、机器学习基础算法(线性回归和逻辑回归)、深度神经网络、卷积神经网络、循环神经网络、经典算法、集成学习、无监督和半监督等非监督学习类型、强化学习实战等内容,以及相关实战案例。本书所有案例均通过Python及Scikit-learn 机器学习库和Keras 深度学习框架实现,同时还包含丰富的数据分析和数据可视化内容。

本书适合对AI 感兴趣的程序员、项目经理、在校大学生以及任何想以零基础学机器学习的人,用以入门机器学习领域,建立从理论到实战的知识通道。

如何选择最佳机器学习算法?相关推荐

  1. 在BRATS挑战赛中用于脑肿瘤分割、预后评估和总体生存预测的最佳机器学习算法

    胶质瘤是最常见的原发性脑恶性肿瘤,具有不同程度的侵袭性.不同的预后和不同的组织学亚区,即瘤周水肿/瘤周浸润侵犯组织,坏死组织,增生活跃的组织,非强化的组织.这种内在的异质性也表现在它们的影像学表型上, ...

  2. 近似算法的近似率_选择最佳近似最近算法的数据科学家指南

    近似算法的近似率 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Willi ...

  3. 机器学习算法优缺点对比及选择

    文章目录 偏差&方差 常见算法优缺点 朴素贝叶斯 Logistic Regression(逻辑回归) 线性回归 最近邻算法--KNN 决策树 ID3.C4.5算法 CART分类与回归树 Ada ...

  4. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

  5. Google Brain 研究员梁辰:从零开始搜索机器学习算法(附视频、PPT)

    导读:2020 年 5 月 16 日上午,在北京智源人工智能研究院主办的智源论坛第 31 期上,AutoML-Zero 团队核心成员梁辰做了题为<AutoML-Zero: Evolving Ma ...

  6. python基线计算法_从头开始:用Python实现基线机器学习算法

    在预测建模时,确定基线性能(baseline performance)是很重要的. 基线为评估更高级的方法提供了比较的标准. 在本教程中,你将了解如何在 Python 中实现基线机器学习算法(Base ...

  7. 机器学习入门篇 | 面向初学者的十大机器学习算法

    作者 | Rekhit Pachanekar 来源 | CDA数据分析师 英国数学家,计算机科学家,逻辑学家和密码分析员艾伦·图灵(Alan Turing)推测未来机器会具有智能. "这就像 ...

  8. 【建议收藏】图解十大经典机器学习算法——带你入门机器学习

    目录 机器学习 机器学习的步骤 01  线性回归 02 逻辑回归 03 线性判别分析 04 分类和回归树 05 朴素贝叶斯 06 K近邻 07 学习矢量量化 08 支持向量机 09 bagging和随 ...

  9. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

最新文章

  1. Linux下NDK的安装配置
  2. 升级Windows10后,远程登录失败,问题:您的凭据不工作(RDP do not work )
  3. Python爬取历年招聘数据,告诉你如何成为备受追捧的数据分析工程师!
  4. oracle创建dblink语句_多个Oracle数据库联合做统计分析
  5. 洛谷P2568 GCD(莫比乌斯反演)
  6. FOREACH的遍历
  7. 【同余最短路】P3403+P2371+P2662+牛客4853D
  8. 长岭县机器人项目_长岭县专业编制项目立项申请报告
  9. 持续集成之Jenkins _ 老徐先带你入个门
  10. 软件开发中的瀑布模型
  11. 服务器查询IPV6地址
  12. 上证50成分股聚类可视化
  13. 快手治理低质量直播内容,运营者需要注意什么?
  14. 于的繁体字有几种写法_处字的繁体字书法作品图片
  15. 淘宝商品评价api接口(app、h5端),淘宝评论视频API接口,淘宝评论API接口
  16. 魅族mx6 原生android,苹果和谷歌都要向它学习!看外媒如何评价魅族MX6
  17. 领英:全球人工智能人才25万 我国人才潜能不输欧美
  18. 条码打印机---关于碳带的选择
  19. cic matlab,Matlab中CIC滤波器的应用
  20. 软考中级软件设计师--9.计算机网络

热门文章

  1. 开工了,给大家送一个新款iPad!
  2. 修改Linux用户名密码的指令
  3. wifi频率和zigbee干扰_防止Wi-Fi和Zigbee共存的干扰方法分享
  4. 客户关系管理包括哪些内容?
  5. chrome浏览器安装插件,提示程序包无效
  6. Xpath安装——程序包无效解决
  7. 2021年安全员-B证考试技巧及安全员-B证操作证考试
  8. http://www.xueh188.top/index.php/archives/35/
  9. Github 高级搜索技巧
  10. Python运行时间评估: timeit module