• 不做键盘侠
    2019-02-08
    为什么test只需要使用transform就可以了?test_ss_x = ss.transform(test_x)

    编辑回复: 一个很好的问题。我在train的时候用到了:train_ss_x = ss.fit_transform(train_x)
    实际上:fit_transform是fit和transform两个函数都执行一次。所以ss是进行了fit拟合的。只有在fit拟合之后,才能进行transform
    在进行test的时候,我们已经在train的时候fit过了,所以直接transform即可。
    另外,如果我们没有fit,直接进行transform会报错,因为需要先fit拟合,才可以进行transform。

     1
     16
  • Ricardo
    2019-04-10
    accuracy_score的参数顺序都错了,由于是计算真实标签和预测标签重合个数与总个数的比值,总能得到正确的答案,但是官方文档中写明的正确顺序应该是(y_true,y_pred)

    编辑回复: 看的很认真,我刚查了下官方文档确实是先写y_true,然后是y_pred,也就是:accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)
    关于score的计算,是判断y_true和y_pred是否相等,也就是 score = y_true == y_pred,然后再根据样本的权重做归一化处理,调用_weighted_sum(score, sample_weight, normalize)
    所以我刚用代码测试了下accuracy_score(y_true, y_pred)和accuracy_score(y_pred, y_true)的结果是一样的。Anyway,规范的话应该按照官方文档的顺序来调用参数。多谢反馈

    
     11
  • 牛奶布丁
    2019-02-13
    老师,为什么做多项式朴素贝叶斯分类的时候,传入的数据不能有负数呢,之前老师讲文本分类的时候好像没有提到这一点?

    编辑回复: 多项式朴素贝叶斯实际上是符合多项式分布,不会存在负数。而高斯朴素贝叶斯呈现的是高斯分布,也就是正态分布,比如均值为0,方差为1的标准正态分布,可以存在负数。

    
     7
  • Yiuway
    2019-09-30
    在做项目的时候,应该什么时候用Min-Max,什么时候用Z-Score呢?当我不做规范化的时候,反而准确率更高,这是为什么呢?在数据规范化该什么时候做不太理解,希望得到回复!

    作者回复: 数据比较零散的话可以使用Min-Max规范化,如果数据符合高斯分布,可以使用Z-Score规范化。
    有些分类方法对归一化比较敏感,比如GaussianNB,效果就不一定好。不过大部分情况下,还是需要先对数据做规范化处理

    
     3
  • third
    2019-02-18
    KNN常用的构造参数
    KNeighborsClassifier(n_neighbors=5,weights='uniform',algorithm='auto',leaf_size=30)
    n_neighbors是邻居的数目

    weights是权重
    uniform是权重相同,求平均值
    distance是根据距离的倒数
    自定义

    algorithm规定邻居的方式
    auto根据数据自动选择
    kd_tree,多维空间的数据结构,一般不超过20维,对关键数据检索很方便
    ball_tree,适用于维度大的
    brute包里搜索,线性扫描

    leaf_size是叶子数

    展开
    
     3
  • Geek_dd384f
    2019-07-01
    #preprocessing.StandardScaler 和preprocessing.scale的区别
    #使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。
    ss = preprocessing.StandardScaler()
    train_ss_x = ss.fit_transform(train_x) #这里的fit_transform相当于先fit 再 transform
    test_ss_x = ss.transform(test_x) #这里没有使用fit_transform 就是因为使用了StandardScaler()
    #使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。
    #train_ss_x = preprocessing.scale(train_x)
    #test_ss_x = preprocessing.scale(test_x)
    展开
     1
     2
  • FORWARD―MOUNT
    2019-02-16
    train_x与train_y都是训练集?

    编辑回复: 对 训练集的特征矩阵和分类结果。对应test_x和test_y是测试集的特征矩阵和分类结果。

    
     2
  • Lee
    2019-02-14
    KNN 中的 K 值设置为 200,KNN 准确率: 0.8489,k值过大,导致部分未知物体没有分类出来,所以准确率下降了

    编辑回复: 对的,K值过大,无法将未知物体分类出来,会降低准确率。

    
     2
  • JingZ
    2019-02-15
    #knn 将K值调为200,准确率变为0.8489了,相比较默认K=5的准确率 0.9756,下降13%

    from sklearn.datasets import load_digits
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn import preprocessing
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.metrics import accuracy_score

    #加载数据
    digits = load_digits()
    data = digits.data

    #数据探索
    print(data.shape)

    #查看第一幅图像
    print(digits.images[0])
    print(digits.target[0])

    #数据可视化
    plt.gray()
    plt.imshow(digits.images[0])
    plt.show()

    #训练集 测试集
    train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)

    #采用 Z-Score 规范化
    ss = preprocessing.StandardScaler()
    train_ss_x = ss.fit_transform(train_x)
    test_ss_x = ss.transform(test_x)

    #创建 KNN 分类器
    knn = KNeighborsClassifier(n_neighbors=200)

    #用训练集训练
    knn.fit(train_ss_x, train_y)

    #用测试集预测
    predict_y = knn.predict(test_ss_x)

    #模型评估
    print('KNN 准确率:%.4lf' % accuracy_score(predict_y, test_y))
    展开

    编辑回复: 对的K值大未必好

    
     1
  • twelve
    2019-12-30
    KNeighborsClassifier(n_neighbors=5, weights='uiform', algorithm='auto', left_size=30)
    # n_neighbors:k值,默认5
    # weights:邻居的权重,uniform是邻居的权重相同,distance是权重是距离的倒数,自定义函数-自定义不同距离对应的权重。
    # algorithm规定邻居的方法:
    #- auto是根据数据情况自动选择合适的算法,
    #- kd_tree是多维空间数据结构,方便对关键数据进行检索,
    #- ball_tree是球树,也是用于多维空间数据结构,但KD树适合维度少于20,ball_tree适合维度大的情况
    #- brute是暴力搜索,采用线性扫描,训练集大时效率低
    # leaf_size:ball_tree或KD树的叶子数,默认30

    KNN就是根据设置的n_neighbors数,找最邻近的n_neighbors的分类结果来进行预测

    n_neighbors设置为200时,准确性为0.8533,用时也比默认值多了。
    展开
    
    
  • Ronnyz
    2019-11-14
    老师能解释下数据分割时random_state的取值有什么规范吗?
    我自己测试的random_state=666与老师=33得出的准确度还是有一些差距的:
    KNN准确率:0.9778
    SVM准确率:0.9733
    多项式朴素贝叶斯准确率:0.9067
    CART决策树准确率:0.8489
    展开

    作者回复: random_state 就是随机数种子,没有必要调整个参数,每次运算结果不同 还是正常的

    
    
  • Geek_94b54f
    2019-08-01
    实际上 数字图片只需要0 和1 区分开来 就可以了吧 期待问答
    
    
  • FeiFei
    2019-07-23
    #n_neighbors:K值
    #weights:节点权重。全一样,或者距离的倒数,或者自定义函数
    #algorithm:auto;kd_tree;ball_tree;brute
    #leaf_size:叶子节点数量

    0.8489
    展开
    
    
  • 张晓辉
    2019-05-21
    如果把K设置为200,KNN的准确率会下降到0.84。比之前默认值要差很多。

    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.datasets import load_digits
    from sklearn.preprocessing import StandardScaler
    from sklearn.preprocessing import MinMaxScaler
    import matplotlib.pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn.svm import SVC
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.tree import DecisionTreeClassifier

    digits = load_digits()
    data = digits.data
    train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
    ss = StandardScaler()

    train_ss_x = ss.fit_transform(train_x)
    test_ss_x = ss.transform(test_x)

    knn = KNeighborsClassifier()
    knn.fit(train_ss_x, train_y)
    predict_y = knn.predict(test_ss_x)
    print("KNN precision %.4lf" % accuracy_score(predict_y, test_y))

    svm = SVC(gamma='auto')
    svm.fit(train_ss_x, train_y)
    predict_y = svm.predict(test_ss_x)
    print("SVM precision %.4lf" % accuracy_score(predict_y, test_y))

    mm = MinMaxScaler()
    train_mm_x = mm.fit_transform(train_x)
    test_mm_x = mm.transform(test_x)
    mnb = MultinomialNB()
    mnb.fit(train_mm_x, train_y)
    predict_y = mnb.predict(test_mm_x)
    print("MultinomialNB precision %.4lf" % accuracy_score(predict_y, test_y))

    dtc = DecisionTreeClassifier()
    dtc.fit(train_mm_x, train_y)
    predict_y = dtc.predict(test_mm_x)
    print("DecisionTree precision %.4lf" % accuracy_score(predict_y, test_y))
    展开
    
    
  • 滢
    2019-04-18
    老师,想问个问题,KNeighborsClassifier的默认k值为5,我们可以给其设置默认k值。在上一节中讲到K值的选取用交叉验证,如果用sklearn实现的话,我们需要给KNeighborsClassifier设定不同的k值来寻找最优K值吗?

    作者回复: 可以这样,用sklearn来寻找最优的超参数

    
    
  • 滢
    2019-04-18
    用代码计算来以下准确率:
    knn默认k值为5 准确率:0.9756
    knn的k值为200的准确率:0.8489
    SVM分类准确率:0.9867
    高斯朴素贝叶斯准确率:0.8111
    多项式朴素贝叶斯分类器准确率:0.8844
    CART决策树准确率:0.8400

    K值的选取如果过大,正确率降低。
    算法效率排行 SVM > KNN(k值在合适范围内) >多项式朴素贝叶斯 > CART > 高斯朴素贝叶斯
    展开

    作者回复: 对的 Good Job 滢离数据总监越来越近了

    
    
  • XP@培新
    2019-04-15
    请教老师一个可能很“外行”的问题,KNN分类器训练输出到底是什么? 感觉直接算不就可以了吗? 谢谢
    
    
  • 周飞
    2019-04-14
    如果把 KNN 中的 K 值设置为 200 ,那么准确率是 0.8489
    
    
  • 周飞
    2019-04-13
    knn分类器的常用构造参数有:
    1.n_neighbors 代表邻居的数量。
    2.weights: 代表所有邻居的权重,其中 uniform 代表所有邻居权重相同, distance 代表权重是距离的倒数。还可以自定义。
    3.algorithm: 计算邻居的方法,auto代表 根据数据的情况自动选择,kd_tree 是kd树,适用于维数不超过20的情况。ball_tree是球树,可以用于维度更大的情况。brute 是暴力搜索。
    4.leaf_size:是kd树或者球树的叶子数量,默认是20.
    展开
    
    
  • 滨滨
    2019-03-30
    knn算法就是说,邻居大多数是什么你就是什么。
    n_neighbors是邻居的数目

    weights是权重
    uniform是权重相同,求平均值
    distance是根据距离的倒数
    自定义

    algorithm规定邻居选择的方式
    auto根据数据自动选择
    kd_tree,类似平衡二叉树,提高查找效率,多维空间的数据结构,一般不超过20维,对关键数据检索很方便
    ball_tree,适用于维度大的
    brute 暴力搜索,线性扫描

    leaf_size是叶子数

    k为200的时候准确率降低。
    多项式分布没有负数,高斯分布可以有负数。
    展开

    作者回复: 对的 总结的不错

    
    
我们在线,来聊聊吧