zoukankan      html  css  js  c++  java
  • 3.2_k-近邻算法案例分析

     

    k-近邻算法案例分析

    本案例使用最著名的”鸢尾“数据集,该数据集曾经被Fisher用在经典论文中,目前作为教科书般的数据样本预存在Scikit-learn的工具包中。

    读入Iris数据集细节资料

    from sklearn.datasets import load_iris
    # 使用加载器读取数据并且存入变量iris
    iris = load_iris()
    
    # 查验数据规模
    iris.data.shape
    
    # 查看数据说明(这是一个好习惯)
    print iris.DESCR

    通过上述代码对数据的查验以及数据本身的描述,我们了解到Iris数据集共有150朵鸢尾数据样本,并且均匀分布在3个不同的亚种;每个数据样本有总共4个不同的关于花瓣、花萼的形状特征所描述。由于没有制定的测试集合,因此按照惯例,我们需要对数据进行随即分割,25%的样本用于测试,其余75%的样本用于模型的训练。

    由于不清楚数据集的排列是否随机,可能会有按照类别去进行依次排列,这样训练样本的不均衡的,所以我们需要分割数据,已经默认有随机采样的功能。

    对Iris数据集进行分割

    from sklearn.cross_validation import train_test_split
    X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.25,random_state=42)

    对特征数据进行标准化

    from sklearn.preprocessing import StandardScaler
    
    ss = StandardScaler()
    X_train = ss.fit_transform(X_train)
    X_test = ss.fit_transform(X_test)

    K近邻算法是非常直观的机器学习模型,我们可以发现K近邻算法没有参数训练过程,也就是说,我们没有通过任何学习算法分析训练数据,而只是根据测试样本训练数据的分布直接作出分类决策。因此,K近邻属于无参数模型中非常简单一种。

    from sklearn.datasets import load_iris
    from sklearn.cross_validation import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.metrics import classification_report
    from sklearn.model_selection import GridSearchCV
    
    def knniris():
        """
        鸢尾花分类
        :return: None
        """
    
        # 数据集获取和分割
        lr = load_iris()
    
        x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, test_size=0.25)
    
        # 进行标准化
    
        std = StandardScaler()
    
        x_train = std.fit_transform(x_train)
        x_test = std.transform(x_test)
    
        # estimator流程
        knn = KNeighborsClassifier()
    
        # # 得出模型
        # knn.fit(x_train,y_train)
        #
        # # 进行预测或者得出精度
        # y_predict = knn.predict(x_test)
        #
        # # score = knn.score(x_test,y_test)
    
        # 通过网格搜索,n_neighbors为参数列表
        param = {"n_neighbors": [3, 5, 7]}
    
        gs = GridSearchCV(knn, param_grid=param, cv=10)
    
        # 建立模型
        gs.fit(x_train,y_train)
    
        # print(gs)
    
        # 预测数据
    
        print(gs.score(x_test,y_test))
    
        # 分类模型的精确率和召回率
    
        # print("每个类别的精确率与召回率:",classification_report(y_test, y_predict,target_names=lr.target_names))
    
        return None
    
    if __name__ == "__main__":
        knniris()

     

  • 相关阅读:
    Lua如何管理”package”
    Lua: 好的, 坏的, 和坑爹的
    Lua中metatable和__index的联系
    Lua5.3 注册表 _G _ENV
    采访 Lua 发明人的一篇文章
    Lua的函数调用和协程中,栈的变化情况
    理解 Lua 的那些坑爹特性
    高性能 Lua 技巧(译)
    LLVM每日谈21 一些编译器和LLVM/Clang代码
    上Https 和 http 差分
  • 原文地址:https://www.cnblogs.com/alexzhang92/p/10070226.html
Copyright © 2011-2022 走看看