机器学习中常见的六种分类算法(附Python源码+数据集)
Editor's Note
专注于人工智能技术,欢迎大家关注
The following article is from 人工智能技术 Author 机器侠
今天和大家学习一下机器学习中常见的六种分类算法,如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])
执行结果
算法特点:
优点:几乎无需输入准备、可实现隐式特征选择、训练速度非常快、其他模型很难超越。
缺点:劣势在于模型大小、是个很难去解释的黑盒子。
使用数据类型:数值型和标称型数据
最后
本文的完整源码和涉及的数据集都已整理完毕
需要的小伙伴,右下角点个【在看】
扫描下方二维码,添加机器侠个人微信领取
方便的话,帮忙点赞、转发,让更多的小伙伴学习
分享
收藏
点赞
在看