Python scikit学习:如何使用不同的功能对数据训练和数据测试进行分类?

Python scikit学习:如何使用不同的功能对数据训练和数据测试进行分类?,python,numpy,scikit-learn,knn,Python,Numpy,Scikit Learn,Knn,我的数据系列:3个功能(永久数据) 我的数据测试:它每次都会更改(2个特性或1个特性),在我的示例代码中,现在是2个特性 我想用不同的特征分类,因为这是一个不同的维度。我怎样才能做到这一点?下面是我的代码: def classify(a): xtrain = np.loadtxt(open("el.csv","rb"), delimiter=",", usecols= (0,1,2), skiprows=1) print xtrain >>[[ -56. -

我的数据系列:3个功能(永久数据)

我的数据测试:它每次都会更改(2个特性或1个特性),在我的示例代码中,现在是2个特性

我想用不同的特征分类,因为这是一个不同的维度。我怎样才能做到这一点?下面是我的代码:

def classify(a):
    xtrain = np.loadtxt(open("el.csv","rb"), delimiter=",", usecols= (0,1,2), skiprows=1)
    print xtrain
    >>[[ -56.  -82. -110.]  
       [-110. -110. -110.]  
       [ -58. -110.  -79.]  
       [ -56. -110. -110.]  
       [ -57.  -83. -110.]  
       [ -63. -110. -110.]  
       [-110. -110. -110.]]

    ytrain = np.loadtxt(open("el.csv","rb"), delimiter=",", usecols= (3,), dtype=int, skiprows=1)   
    print ytrain
    >>[1 1 2 2 3 3 4]       

    xtest = np.asarray(a)
    xtest = xtest.reshape([1,-1])
    print xtest
    >>[['-83' '-56']]

    knn = neighbors.KNeighborsClassifier(n_neighbors=7, weights='distance') #Fuzzy K-Nearest Neighbor
    knn.fit(xtrain, ytrain)

    results = knn.predict(xtest)
    print results
错误是:

ValueError:X和Y矩阵的尺寸不兼容:X.shape[1]== 2而Y.shape[1]==3


目前,sklearn模型不处理测试集中缺少的值。您可以维护多个模型(针对不同的功能进行培训),并针对要预测的每种类型的数据使用适当的模型。
另一种选择是为不具备所有功能的实例填充缺少的值。

首先,让as生成一些训练和测试数据:

import numpy as np
xtrain = np.asarray([[ -56.,  -82., -110.],
                     [-110., -110., -110.],
                     [ -58., -110.,  -79.],
                     [ -56., -110., -110.],
                     [ -57.,  -83., -110.],
                     [ -63., -110., -110.],
                     [-110., -110., -110.]], dtype='float')
ytrain = np.asarray([1, 1, 2, 2, 3, 3, 4], dtype='int')
现在,您必须使用整数键创建字典
knns
。与键n对应的值是k近邻分类器,该分类器仅使用训练数据的前n个特征进行训练

from sklearn.neighbors import KNeighborsClassifier
knns = {}
for n_feats in range(1, xtrain.shape[-1] + 1):
    knns[n_feats] = KNeighborsClassifier(n_neighbors=7, weights='distance')
    knns[n_feats].fit(xtrain[:, :n_feats], ytrain)
classify
函数应该使用两个参数,即测试数据和分类器字典。通过这种方式,您可以确保分类是由使用完全相同的测试数据特征(并丢弃其他特征)训练的分类器执行的:

演示(注意测试数据必须是数字而不是字符串):

def classify(test_data, classifiers):
    """Classify test_data using classifiers[n], which is the classifier
    trained with the first n features of test_data
    """
    X = np.asarray(test_data, dtype='float')
    n_feats = X.shape[-1]
    return classifiers[n_feats].predict(X)
In [107]: xtest1 = [[-83, -56]]

In [108]: classify(xtest1, knns)
Out[108]: array([3])

In [109]: xtest2 = [[ -52],
     ...:           [-108],
     ...:           [ -71]]
     ...: 

In [110]: classify(xtest2, knns)
Out[110]: array([2, 1, 3])

In [111]: xtest3 = [[-122,  -87,  -94],
     ...:           [-136,  -99, -107]]
     ...: 

In [112]: classify(xtest3, knns)
Out[112]: array([1, 1])