• 机器学习中常见的六种分类算法(附Python源码+数据集)
  • 2025-05-26 02:37:13
  • 今天和大家学习一下机器学习中常见的六种分类算法,如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])

    执行结果

    总结

    算法特点:

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

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

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

    最后

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

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

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

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

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

    收藏

    点赞

    在看