今天和大家学习一下机器学习中常见的六种分类算法,如K近邻、决策树、朴素贝叶斯、逻辑回归、支持向量机、随机森林

除了介绍这六种不同分类算法外,还附上对应的Python代码案例,并分析各自的优缺点。

01

K近邻(KNN)

k-近邻算法KNN就是K-Nearest neighbors Algorithms的简称,它采用测量不同特征值之间的距离方法进行分类,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

代码案例

数据集:iris.csv(文末会提供)

import pandas as pd
import numpy as np
import operator
# 导入数据
data = pd.read_csv("iris.csv")

前四列为特征,最后一列为类别

欧几里距离

# 计算两个数据点之间的欧几里德距离
def euclideanDistance(data1, data2, length):distance = 0for x in range(length):distance += np.square(data1[x] - data2[x])return np.sqrt(distance)

KNN模型

# KNN 模型
def knn(trainingSet, testInstance, k):distances = {}sort = {}length = testInstance.shape[1]# 计算每行训练数据和测试数据之间的欧氏距离for x in range(len(trainingSet)):dist = euclideanDistance(testInstance, trainingSet.iloc[x], length)distances[x] = dist[0]# 根据距离对它们进行排序sorted_d = sorted(distances.items(), key=operator.itemgetter(1))neighbors = []# 提取前 k 个邻居for x in range(k):neighbors.append(sorted_d[x][0])classVotes = {}# 计算邻居中频率最高的类别for x in range(len(neighbors)):response = trainingSet.iloc[neighbors[x]][-1]if response in classVotes:classVotes[response] += 1else:classVotes[response] = 1sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)return (sortedVotes[0][0], neighbors)

预测某数据的类别

# 定义一个测试数据
test_data = [[6.8,5.1,4.9,1.5]]
test = pd.DataFrame(test_data)
# 设置邻居数 = 3
k = 3
# 运行 KNN 模型
result, neigh = knn(data, test, k)
# 预测类别  相邻的k个邻居
print("类别:",result,"相邻的k个邻居:",neigh)

执行结果

总结

算法特点:

优点:精度高、对异常值不敏感、无数据输入假定

缺点:计算复杂度高、空间复杂度高

适用数据范围:数值型和标称型

02

决策树

决策树(Decision Trees)是一种非参监督学习方法,即没有固定的参数,对数据进行分类或回归学习。决策树的目标是从已知数据中学习得到一套规则,能够通过简单的规则判断,对未知数据进行预测。

代码案例

数据集:train.csv(文末提供)

from sklearn import tree
from sklearn.model_selection import train_test_split
import pandas as pd
titanic = pd.read_csv("data/train.csv")

前面几列为特征,最后一列为类别

特征处理

## 数据特征处理
titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
titanic["Embarked"] = titanic["Embarked"].fillna("S")
candidate_train_predictors = titanic.drop(['PassengerId','Survived','Name','Ticket','Cabin'], axis=1)
categorical_cols = [cname for cname in candidate_train_predictors.columns ifcandidate_train_predictors[cname].nunique() < 10 andcandidate_train_predictors[cname].dtype == "object"]
numeric_cols = [cname for cname in candidate_train_predictors.columns ifcandidate_train_predictors[cname].dtype in ['int64', 'float64']]
my_cols = categorical_cols + numeric_cols
train_predictors = candidate_train_predictors[my_cols]
dummy_encoded_train_predictors = pd.get_dummies(train_predictors)

数据分割(训练和测试)

# 类别标签
y_target = titanic["Survived"].values
x_features_one = dummy_encoded_train_predictors.values
# 分割数据(75%训练,25%测试)
x_train, x_validation, y_train, y_validation = train_test_split(x_features_one,y_target,test_size=.25,random_state=1)

训练和测试

# 决策树
tree = tree.DecisionTreeClassifier()
# 训练
tree = tree.fit(x_features_one, y_target)
# 测试
accuracy = round(tree.score(x_features_one, y_target), 4)
print("准确度: %0.4f" % (accuracy))

执行结果

总结

算法特点:

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能会产生过度匹配问题。

适用数据类型:数值型和标称型

03

朴素贝叶斯

朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独立假设的分类方法,它通过特征计算分类的概率,选取概率大的情况进行分类。

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。

下面以其中一个作为实战案例(GaussianNB)

代码案例

import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
#拟合数据
clf.fit(X, Y)
print("==[-0.8, -1]预测结果==")
print(clf.predict([[-0.8, -1]]))
print("==[3,2]预测结果==")
print(clf.predict([[3, 2]]))

执行结果

总结

算法特点:

优点:在数据较少的情况下依然有效,可以处理多类别问题。

缺点:对于输入数据的准备方式较为敏感。

适用数据类型:标称型数据

04

逻辑回归

逻辑(Logistic) 回归是一种统计方法,用于根据先前的观察结果预测因变量的结果。它是一种回归分析,是解决二分类问题的常用算法

代码案例

数据集:回归.txt(随意构造,文末会提供)

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from numpy import *
train_x = []
train_y = []
fileIn = open('data/回归.txt')
for line in fileIn.readlines():lineArr = line.strip().split()train_x.append([1.0, float(lineArr[0]), float(lineArr[1])])train_y.append(float(lineArr[2]))
train_x = mat(train_x)
train_y = mat(train_y).transpose()

前两列是特征,最后一列是类别(label)

分割数据&训练预测

X_train,X_test,y_train,y_test = train_test_split(train_x,train_y,train_size=.7)
print("逻辑回归(sklearn实现):")
logr = LogisticRegression()
logr.fit(X_train,y_train)
print("准确度:",logr.score(X_test,y_test))

执行结果

总结

算法特点:

优点:计算代价不高,易于理解和实现

缺点:容易欠拟合,分类精度可能不高(这里是使用构造数据,效果较佳,并且运行多次,结果可能不一样)

使用数据类型:数值型和标称型数据

05

支持向量机(SVM)

支持向量机(简称SVM)英文为Support Vector Machine。它是一 种监督式学习的方法,它广泛的应用于统计分类以及回归分析中。支持向量机(Support Vector Machine)是一种十分常见的分类器,核心思路是通过构造分割面将数据进行分离。

代码案例

数据集:iris.csv

from sklearn import svm
import pandas as pd
from sklearn.model_selection import train_test_split
# 导入数据
data = pd.read_csv("data/iris.csv")

分割数据&训练预测

x =  data.iloc[:, 0:4]  # 按位置取某几列
y = data["Name"].values
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())
print("训练集精度:",clf.score(x_train, y_train))
print("测试集精度:",clf.score(x_test, y_test))

执行结果

总结

算法特点:

优点:计算代价不高,易于理解和实现

缺点:容易欠拟合,分类精度可能不高

使用数据类型:数值型和标称型数据

06

随机森林

随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。随机森林解决决策树泛化能力弱的特点

代码案例

数据集:iris(sklearn自带)

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_iris
iris = load_iris()
# 4个特征属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度
# 标签是花的种类:setosa versicolour virginica
rf = RandomForestRegressor()  # 这里使用了默认的参数设置
rf.fit(iris.data[:150], iris.target[:150])  # 进行模型的训练
# 预测样本
instance = iris.data[[50]]
print('预测类别:', rf.predict(instance),"真实类别:",iris.target[50])
instance = iris.data[[148]]
print('预测类别:', rf.predict(instance),"真实类别:",iris.target[148])

执行结果

总结

算法特点:

优点:几乎无需输入准备、可实现隐式特征选择、训练速度非常快、其他模型很难超越。

缺点:劣势在于模型大小、是个很难去解释的黑盒子。

使用数据类型:数值型和标称型数据

最后

本文的完整源码和涉及的数据集都已整理完毕

需要的小伙伴,右下角点个【在看】

扫描下方二维码,添加机器侠个人微信领取

方便的话,帮忙点赞、转发,让更多的小伙伴学习

分享‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

收藏

点赞

在看

机器学习中常见的六种分类算法(附Python源码+数据集)相关推荐

  1. C语言从未排序的链接列表中删除重复项的算法(附完整源码)

    C语言从未排序的链接列表中删除重复项的算法 C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main函数测试) C语言从未排序的链接列表中删除重复项的算法完整源码(定义,实现,main ...

  2. C语言用‘%20‘替换字符串中的所有空格的算法(附完整源码)

    C语言用'%20'替换字符串中的所有空格的算法 C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实现,main函数测试) C语言用'%20'替换字符串中的所有空格的算法完整源码(定义,实 ...

  3. 深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系列算法原理,以及Faster RCNN的实现.这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起 ...

  4. python目标识别算法_深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    摘要: 本文是目标检测系列文章--YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣. 在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系 ...

  5. python 自动化微信小程序_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...

    原标题:干货 | 微信小程序自动化测试最佳实践(附 Python 源码) 本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善, ...

  6. 华中杯 数学建模 A题简单复盘(附Python源码)

    华中杯 A题简单复盘(附Python 源码) 文章目录 华中杯 A题简单复盘(附Python 源码) 前言 题目简介 问题背景 题目以及思路 分批算法设计 MindMap 遗传算法优缺点 优点 缺点 ...

  7. Agisoft Metashape 照片高程改正 附python源码

    Agisoft Metashape 照片高程改正 附python源码 文章目录 Agisoft Metashape 照片高程改正 附python源码 前言 一.计算高程改正数 二.python源码 三 ...

  8. python和苹果_苹果手机评论情感分析(附python源码和评论数据)

    原标题:苹果手机评论情感分析(附python源码和评论数据) 首先抓取网页上的数据,每一页十条评论,生成为一个txt文件. 数据链接 回复公众号 datadw 关键字"苹果"获取. ...

  9. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

最新文章

  1. codebilcks怎么新建c++文件_电脑开机后桌面空白一个图标都没有,怎么回事?
  2. JAVA JVM原理详解
  3. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
  4. BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)
  5. PX4避障和轨迹规划(3DVFH*)
  6. 字符串转换为小数(如String a=“123“),转换之后为123.0
  7. Ruby——关于require与require_relative
  8. python实现卷积神经网络_【455】Python 徒手实现 卷积神经网络 CNN
  9. java监控gc线程_Java应用性能监控系统,使用JMX实现,实现了类加载监控、内存监控、线程监控、GC监控...
  10. 一份王者荣耀的英雄数据报告
  11. 英文顺序:第一~第N
  12. cad卸载不干净_如何才能干净的卸载顽固软件?不给恶意软件留机会!
  13. 221.Beta多样性PCoA和NMDS排序
  14. 一张图看懂财务报表分析
  15. java毕业设计成品基于JSP实现的飞机票售票管理系统[包运行成功]
  16. html embed自动播放,html embed标签怎么用
  17. 根据书单来制作item2vec
  18. Altium Designer四层板设计教程
  19. 《给中国学生的第四封信:大学四年应是这样度过》
  20. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(1)

热门文章

  1. python 题库自动答题_国家开放大学(国开)线上作业自动答题python-selenium
  2. 实验三的各种特效案例
  3. 【pulsar学习】pulsar架构原理
  4. 笔记本插上移动硬盘wifi就上不了网,除了供电问题,驱动冲突的可能更大。
  5. 集成算法-Boosting算法案例及推理过程
  6. WannaCry勒索病毒复现及分析,蠕虫传播机制全网源码详细解读 | 原力计划
  7. SAP AIF BIT750
  8. Spark集群环境搭建(standalone模式)
  9. 电脑连不上自己家wifi,怎么办?
  10. STM32103-OLED不显示的原因