• 3.分类算法目标值离散型


    一、k-近邻算法

    1、工作机制

    • 给定一个测试样本
    • 计算它到训练样本的距离
    • 取离测试样本最近的k个训练样本
    • “投票法”选出在这k个样本中出现最多的类别,就是预测的结果

    2、计算距离公式(欧式距离)

    3、api

     4、优缺点

    5、使用交叉验证和网格搜索对k近邻算法调优

    1)交叉验证

    1. 目的

    交叉验证的目的是为了让模型评估更加准确可信。

    2. 基本思想

    基本思想是将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来作为评价分类器的性能指标。

    2)网格搜索

    通常情况下,很多超参数需要调节,但是手动过程繁杂,所以需要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

    api:

     代码:

    knn = KNeighborsClassifier() #注意不用设置k值
    
    param = {"n_neighbors": [3,5,10]}
    gscv = GridSearchCV(knn, param_grid=param, cv=10)
    
    gscv.fit(x_train, y_train)
    
    print(gscv.score(x_test, y_test))
    print(gscv.best_score_)
    print(gscv.best_estimator_)
    print(gscv.best_params_)
    print(pd.DataFrame(gscv.cv_results_).T)

    二、朴素贝叶斯算法

    1、工作原理

    朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 xx ,利用贝叶斯定理求出后验概率最大的输出 yy 。

    2、公式

    3、api

    4、案例

     代码:

    from sklearn.datasets import fetch_20newsgroups
    from sklearn.model_selection import train_test_split
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.naive_bayes import MultinomialNB
    
    def naviebayes():
        #获取数据集
        news = fetch_20newsgroups(subset='all')
    
        #进行数据分割
        x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)
    
        #对数据集进行特征抽取
        tf = TfidfVectorizer()
        #对训练集中词的列表进行重要性统计
        x_train = tf.fit_transform(x_train)
        x_test = tf.transform(x_test)
    
        #进行朴素贝叶斯算法的预测
        mlt = MultinomialNB(alpha=1.0)
        mlt.fit(x_train,y_train)
    
        #打印预测结果
        y_predict = mlt.predict(x_test)
        print("预测结果为:",y_predict)
    
        #打印准确率
        ret = mlt.score(x_test,y_test)
        print("准确率为:",ret)
    
        return None
    
    
    if __name__ == "__main__":
        naviebayes()

    结果:

    预测结果为: [ 8  0  5 ... 11 13 16]
    准确率为: 0.847623089983022

    5、优缺点

    三、决策树

    1.原理

    在现实生活中,我们会遇到各种选择,不论是选择男女朋友,还是挑选水果,都是基于以往的经验来做判断。如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是我们今天要讲的决策树。

    2、几个概念

    将哪个属性作为决策树根节点是个关键问题,在这里我们先介绍两个指标:纯度和信息熵。

    纯度:你可以把决策树的构造过程理解成为寻找纯净划分的过程。数学上,我们可以用纯度来表示,纯度换一种方式来解释就是让目标变量的分歧最小。
    
    信息熵:表示信息的不确定度
    
    
    信息熵越大,纯度越低。当集合中的所有样本均匀混合时,信息熵最大,纯度最低。

    我们在构造决策树的时候,会基于纯度来构建。而经典的 “不纯度”的指标有三种,分别是信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)

    3、api

    4、案例

     代码:

    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.tree import DecisionTreeClassifier
    
    def decisionTree():
        #读取数据
        titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    
        #处理数据,找出特征值和目标值
        x = titan[['pclass','age','sex']]
        y = titan['survived']
    
        #处理缺失值 x['age'].mean()取平均值 inplace替换
        x['age'].fillna(x['age'].mean(),inplace=True)
    
        #分割数据
        x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.25)
    
        #进行特征工程 x_train.to_dict(orient="records")将数据转换成字典形式
        dict = DictVectorizer(sparse=False)
        x_train = dict.fit_transform(x_train.to_dict(orient="records"))
        x_test = dict.transform(x_test.to_dict(orient="records"))
    
        #利用决策树进行预测
        dTree = DecisionTreeClassifier()
        dTree.fit(x_train,y_train)
    
        #预测准确率
        print("预测的准确率:",dTree.score(x_test,y_test))
    
        return None
    
    
    if __name__ == "__main__":
        decisionTree()

    5、决策树结构图

     

    6、优缺点

    四、随机森林

    1、简介

    随机森林是一种多功能的机器学习算法,能够执行回归和分类的任务。同时,它也是一种数据降维手段,用于处理缺失值、异常值以及其他数据探索中的重要步骤,并取得了不错的成效。另外,它还担任了集成学习中的重要方法,在将几个低效模型整合为一个高效模型时大显身手。

    在随机森林中,我们将生成很多的决策树,并不像在CART模型里一样只生成唯一的树。当在基于某些属性对一个新的对象进行分类判别时,随机森林中的每一棵树都会给出自己的分类选择,并由此进行“投票”,森林整体的输出结果将会是票数最多的分类选项;而在回归问题中,随机森林的输出将会是所有决策树输出的平均值。

    2、api

    4、代码案例

    将预测泰坦尼克号案例算法换成随机森林

     # -----------------利用随机森林进行预测----------------------
        rf = RandomForestClassifier()
        param = {"n_estimators":[120,200,300],"max_depth":[5,8,15]}
    
        #使用交叉验证和网格搜索对超参数进行调优
        gc = GridSearchCV(rf, param_grid=param,cv=2)
        gc.fit(x_train,y_train)
    
        #预测结果
        print("准确率:",gc.score(x_test,y_test))
        print("选择的模型:",gc.best_params_)

    结果:

    准确率: 0.8111675126903554
    选择的模型: {'n_estimators': 300, 'max_depth': 5}
  • 相关阅读:
    SpringBoot-10-之初阶整合篇(下)
    09--SpringBoot之初阶整合篇(上)
    07--SpringBoot之数据库JPA(CRUD)
    go 文件操作 io
    类型断言
    多态
    golang interface
    go strcut 封装
    go struct 抽象
    poj-3280 Cheapest Palindrome (dp)
  • 原文地址:https://www.cnblogs.com/linfinity/p/13744167.html
Copyright © 2020-2023  润新知