查看原文
其他

机器学习中常见的六种分类算法(附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个朴素贝叶斯的分类算法类。分别是GaussianNBMultinomialNBBernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。


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

  代码案例
import numpy as np
X = np.array([[-1-1], [-2-1], [-3-2], [11], [21], [32]])
Y = np.array([111222])
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([[32]]))

执行结果


  总结

算法特点:

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

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

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


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])

执行结果


  总结

算法特点:

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

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

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




最后



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



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

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


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

分享

收藏

点赞

在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存