AI学习---分类算法

分类算法:对目标值进行分类的算法
    1、sklearn转换器和预估器
    2、KNN算法
    3、模型选择与调优
    4、朴素贝叶斯算法
    5、决策树
    6、随机森林

sklearn转换器(transfer)与估计器(estimeter)

1、转换器 - 特征工程的父类

转换器 - 特征工程的父类
    1、API的实现过程:
        1 实例化 (实例化的是一个转换器类(Transformer))
        2 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
    2、sklearn的标准化:
        计算公式:(x - mean) / std
           x: 数据
           mean: 该列的平均值
           std: 标准差
        我们调用fit_transform()实际上发生了2个步骤:
            fit()               计算 每一列的平均值、标准差
            transform()     (x - mean) / std进行最终的转换

# 转换器的实例讲解
import sklearn
# 特征预处理
from sklearn.preprocessing import StandardScaler


def stand_demo():
    data = [[1, 2, 3], [4, 5, 6]]
    # 1、实例化一个类
    std = StandardScaler()
    # 2、调用fit_transform()
    new_data = std.fit_transform(data)

    ''' 
    
        fit = std.fit(data):  # 已经完成了列的平均值和标准差的计算
            StandardScaler(copy=True, with_mean=True, with_std=True)
            
        std = std.transform(data): # 根据公式(x - mean) / std进行最终的转换
            [[-1. -1. -1.]
            [ 1.  1.  1.]]
            
        new_data = std.fit_transform(data): 
            [[-1. -1. -1.]
            [ 1.  1.  1.]]
    '''
    print(new_data)


if __name__ == '__main__':
    stand_demo()

2、估计器--sklearn机器学习算法的实现

基于估计器的算法API

image

估计器的工作流程:

估计器(estimator)
        1 实例化一个estimator
        2 estimator.fit(x_train, y_train)   --> 用于计算

                 x_train: 训练集的特征值, y_train: 训练集的目标值
                 —— 调用完毕,模型生成
        3 模型评估(有2种方法实现):
            1)直接比对真实值和预测值
                    y_predict = estimator.predict(x_test)   # x_test: 测试集的特征值, y_predict: 测试集的预测值

                    y_test == y_predict                           # 对比测试集的预测值(y_predict)与测试集的目标值(y_test)是否一致
            2)计算准确率
                    accuracy = estimator.score(x_test, y_test)  # 传递测试集特征值和测试集目标值进行准确率计算

image

KNN算法(K-近邻算法)

image

KNN的核心算法: 通过计算A到邻居(B、C、D、E、F)的距离可以判断A属于哪个类别(区域)。K就是相似特征

距离计算公式:

     0、欧式距离

     1、曼哈顿距离 (绝对值距离)

     2、明可夫斯基距离(基于0和1实现)

image

K-近邻算法对目标数据的处理:

       无量纲化的处理,即【标准化】(归一化会受到异常数据影响)

image

如果取的最近的电影数量不一样?会是什么结果?
      k 值取得过小(即1个样本点),容易受到异常点的影响
      k 值取得过大(即取出多样本),样本不均衡的影响

K-近邻算法API

image

KNN算法案例1:鸢尾花种类预测

image

案例分析:

   1. 获取数据(sklearn自带的数据即可)

   2. 数据处理(可省略,数据已经处理的很好了,目的是取出不完整的数据)

   3. 特征工程

         1. 数据集的划分(训练数据 + 测试数据)

         2. 特征抽取(可省略,4个特征)

         3. 特征预处理(标准化)  --》 训练数据和测试数据都需要

         4. 降维(可省略,降维的目的是减少特征,这里就4个特征)

   4. KNN预估计流程

   5. 模型评估

基于KNN实现鸢尾花的分类完整Demo:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

def knn_demo():
    '''
      基于KNN实现鸢尾花的分类
    :return:
    '''

    # 1、获取数据
    iris = load_iris()
    print('iris', iris.data.shape)
    # 2、数据划分
    # 结果跟随机数种子random_state有关
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 3、特征工程: 标准化
    stand_transfer = StandardScaler()
    '''
       原则: 训练集的数据做的操作,测试集也是需要做同样的操作
       实现: 
            训练集:
                stand_transfer对训练集进行了fit()和transfer(),即fit用于计算平均值和标准差,tranfer用于公式计算
            测试集:
                stand_transfer对训练集进行了transfer(),即用训练集求出来的平均值和标准差进行最后的公式计算(标准化)
                如果对测试集用了fit_tranform(),即对测试集测试的仅仅是自己的数据内容,与训练内容无关
    '''
    x_train = stand_transfer.fit_transform(x_train)  # 要对训练标准化
    print('x_train', x_train.shape)
    x_test = stand_transfer.transform(x_test)  # 用训练集的平均值和标准差对测试集进行标准化
    print('x_test', x_test.shape)

    # 4、KNN算法评估器
    knn_estimater = KNeighborsClassifier(n_neighbors=3) # 邻居数量,默认是5
    knn_estimater.fit(x_train, y_train)   # 训练完成,产生模型;x_train: 训练集的特征值, y_train: 训练集的目标值

    # 5、模型评估
    # 方法1;直接对比真实值和预测值
    y_predict = knn_estimater.predict(x_test)
    print('y_predict', y_predict)
    print('真实值和预测值:', y_predict == y_test)

    # 方法2:计算准确率
    score = knn_estimater.score(x_test, y_test) # 传递测试集特征值和测试集目标值进行准确率计算
    print('准确率:',score)
    return  None


if __name__ == '__main__':
    knn_demo()

image

KNN算法总结

image 

附: 我们可以利用【模型与调优】进行K的确定

模型选择与调优

image

模型选择与调优的方案

   1、交叉验证(Cross Validate)

   2、超参数搜索 –> 网格搜索(Grid Search)

方案一:交叉验证(cross validate, 即有限数据多次验证,被评估的模型更加可信)

image

方案二:超参数搜索--网格搜索(Grid Search)

image

模型选择与调优API

    说明:GridSearchCV实际上也是一个评估器,用法与上面相同

image

基于KNN实现鸢尾花的分类,添加网格搜索和交叉验证,用于确定最优的K值完整Demo:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


def knn_gridSearch_demo():
    '''
      基于KNN实现鸢尾花的分类,添加网格搜索和交叉验证,用于确定最优的K值
    :return:
    '''

    # 1、获取数据
    iris = load_iris()
    print('iris', iris.data.shape)
    # 2、数据划分
    # 结果跟随机数种子random_state有关
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=3)
    # 3、特征工程: 标准化
    stand_transfer = StandardScaler()
    '''
       原则: 训练集的数据做的操作,测试集也是需要做同样的操作
       实现: 
            训练集:
                stand_transfer对训练集进行了fit()和transfer(),即fit用于计算平均值和标准差,tranfer用于公式计算
            测试集:
                stand_transfer对训练集进行了transfer(),即用训练集求出来的平均值和标准差进行最后的公式计算(标准化)
                如果对测试集用了fit_tranform(),即对测试集测试的仅仅是自己的数据内容,与训练内容无关
    '''
    x_train = stand_transfer.fit_transform(x_train)  # 要对训练标准化
    print('x_train', x_train.shape)
    x_test = stand_transfer.transform(x_test)  # 用训练集的平均值和标准差对测试集进行标准化
    print('x_test', x_test.shape)

    # 4、KNN算法评估器
    knn_estimater = KNeighborsClassifier()

    # 5、加入网格搜索与交叉验证
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}  # 这里只能是字典
    '''
        estimator : estimator object.
        param_grid : dict or list of dictionaries
    '''
    knn_estimater = GridSearchCV(estimator=knn_estimater, param_grid=param_dict, cv=10)
    knn_estimater.fit(x_train, y_train)  # 训练完成,产生模型;x_train: 训练集的特征值, y_train: 训练集的目标值

    # 6、模型评估
    # 方法1;直接对比真实值和预测值
    y_predict = knn_estimater.predict(x_test)
    print('y_predict', y_predict)
    print('真实值和预测值:', y_predict == y_test)

    # 方法2:计算准确率
    score = knn_estimater.score(x_test, y_test)  # 传递测试集特征值和测试集目标值进行准确率计算
    print('准确率:', score)

    # 最佳参数:best_params
    print("最佳参数:\n", knn_estimater.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:\n", knn_estimater.best_score_)
    # 最佳估计器:best_estimator_
    print("最佳估计器:\n", knn_estimater.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:\n", knn_estimater.cv_results_)

    return None


if __name__ == '__main__':
    knn_gridSearch_demo()

image

拓展:

image

 

Facebook的预测签到位置案例:

image

image

 

朴素贝叶斯算法

决策树

随机森林

猜你喜欢

转载自www.cnblogs.com/ftl1012/p/10504833.html
今日推荐