使用 scikit-learn 在 Python 中使用稀疏矩阵进行 kNN 估计?

kNN Estimation with Sparse Matrices in Python using scikit-learn?

我有这样的数据:

line1 = '-0.9821 1:15 2:20 4:10 8:10'
line2 = '0.1235 1:15 2:20 6:10 10:10'
line3 = '0.2132 1:15 3:20 5:10 9:10'
line4 = '0.328 2:15 4:20 6:10 7:12 8:16 10:10'
line5 = '0.973 2:15 3:20 6:10 8:12 9:10'

每行的第一个条目是输出 (Y) 变量。其余条目表示稀疏向量(例如,“1:15”表示在索引 1 处,X 值为 15)。

我正在尝试根据 kNN 估计计算预测 Y。我是稀疏矩阵的新手。我发现一些文档说我可以使用稀疏矩阵来估计 kNN:

knn = neighbors.KNeighborsClassifier(n_neighbors=2, weights='distance')
knn.fit(X, Y)

我不确定如何创建 X 和 Y 矩阵,然后如何根据 kNN 估计值预测 Y。非常感谢对像我这样的初学者的任何帮助。

简而言之,您使用的格式会给您带来相当大的痛苦。长的是它仍然绝对有可能进行这种转换,您只需要相当数量的 goo-code。您需要做的第一件事是在第一次出现 space 时拆分每个字符串,并将其余字符串分组到 x.

from scipy import sparse

y, _, x = line1.partition(" ")
y = float(y)
x = convert_to_csc(x, shape)

def convert_to_csc(x, shape):
    sparse_matrix = sparse.csc_matrix(shape)
    for entry in x.split():
        index, value = entry.split(:)
        sparse_matrix[index] = value
    return sparse_matrix

我会将其余部分留作 reader 的练习,但其余部分应该非常简单。如果您以后有机会,我建议您使用更强大的格式。

为了清楚起见,在此示例中聚合 xy 将为您提供上面代码中的 XY .就事后做出预测而言,sklearn 使用 fit_transform 范式,这意味着首先 fit,然后 transform。在上面调用 fit 之后,你可以得到这样的预测:

prediction = knn.transform(example_x)

我仍然认为您应该考虑在本地使用 sklearn 的 SVR。我也强烈建议尝试另一种模型。在这种情况下,逻辑回归可能不会为您提供比 SVR 更好的性能(尽管我可能是错的),但它可以作为您考虑添加的任何增强或一般数据调整的优秀测试平台,如果不是其他原因的话比计算效率。您正在谈论的数据集上的 SVR 是......不会很快 运行。

使用稀疏数组来存储数据。将字符串值解析为稀疏数组,然后在 knn

上进行拟合和预测
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

line1 = '-0.9821 1:15 2:20 4:10 8:10'
line2 = '0.1235 1:15 2:20 6:10 10:10'
line3 = '0.2132 1:15 3:20 5:10 9:10'
line4 = '0.328 2:15 4:20 6:10 7:12 8:16 10:10'
line5 = '0.973 2:15 3:20 6:10 8:12 9:10'

data=[line1,line2,line3,line4,line5]

sparseMatrix = csr_matrix((5, 15), 
                      dtype = np.float).toarray()
row=0
for item in data:
    for entry in item.split(' '):
        if ':' in entry:
            index,value = entry.split(':')
            sparseMatrix[row,int(index)]=value
        else:
            sparseMatrix[row,0]=entry
    row+=1


X=sparseMatrix[:,1:15]
y=(sparseMatrix[:,0]*10).astype(int)

knn=KNeighborsClassifier(algorithm='auto',
                     leaf_size=10,
                     metric='minkowski',
                     metric_params=None,
                     n_jobs=1,
                     n_neighbors=3,
                     p=2,
                     weights='uniform')

 X_train, X_test, y_train, y_test= train_test_split(X,y,test_size=0.2, random_state=21)
knn.fit(X_train,y_train)

train_accuracy = knn.score(X_train, y_train)
test_accuracy=knn.score(X_test,y_test)
print(train_accuracy,test_accuracy)

for item in X:
   prediction=knn.predict([item])
   print(item,prediction)

y_pred=knn.predict(X_test)
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))  

输出:

 0.25 0.0
 [15. 20.  0. 10.  0.  0.  0. 10.  0.  0.  0.  0.  0.  0.] [-9]
 [15. 20.  0.  0.  0. 10.  0.  0.  0. 10.  0.  0.  0.  0.] [-9]
 [15.  0. 20.  0. 10.  0.  0.  0. 10.  0.  0.  0.  0.  0.] [-9]
 [ 0. 15.  0. 20.  0. 10. 12. 16.  0. 10.  0.  0.  0.  0.] [-9]
 [ 0. 15. 20.  0.  0. 10.  0. 12. 10.  0.  0.  0.  0.  0.] [-9]