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

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

今天和大家学习一下机器学习中常见的六种分类算法,如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 = 0

for 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] += 1

else:

classVotes[response] = 1

sortedVotes = 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 if

candidate_train_predictors[cname].nunique() < 10 and

candidate_train_predictors[cname].dtype == "object"]

numeric_cols = [cname for cname in candidate_train_predictors.columns if

candidate_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])执行结果

总结

算法特点:

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

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

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

最后

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

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

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

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

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

收藏

点赞

在看

🎈 相关推荐

CQ9五福临门游戏有什么技巧?分享几个爆分的实用攻略,远离氪金
揭示蚂蚁的起源与演化:自然界中的社会奇迹
揭秘印度小姐:数量之最,价格亲民,揭秘美丽背后的故事