Ant*_*uel 3 python scikit-learn
我正在制作一个遗传算法来寻找权重,以便将它们应用于 sklearn KNN 中的欧几里得距离,试图提高分类率并删除数据集中的一些特征(我通过将权重更改为 0 来实现这一点)。我正在使用 Python 和 sklearn 的 KNN。这就是我使用它的方式:
def w_dist(x, y, **kwargs):
return sum(kwargs["weights"]*((x-y)*(x-y)))
KNN = KNeighborsClassifier(n_neighbors=1,metric=w_dist,metric_params={"weights": w})
KNN.fit(X_train,Y_train)
neighbors=KNN.kneighbors(n_neighbors=1,return_distance=False)
Y_n=Y_train[neighbors]
tot=0
for (a,b)in zip(Y_train,Y_vecinos):
if a==b:
tot+=1
reduc_rate=X_train.shape[1]-np.count_nonzero(w)/tamaño
class_rate=tot/X_train.shape[0]
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但速度很慢。我一直在分析我的代码,最慢的部分是距离的评估。
我想问一下是否有一些不同的方法可以告诉 KNN 在距离中使用权重(我必须使用欧几里德距离,但我删除了平方根)。
谢谢!
确实还有另一种方法,它内置于 scikit-learn 中(所以应该更快)。您可以将wminkowski指标与权重一起使用。以下是训练集中特征的随机权重示例。
knn = KNeighborsClassifier(metric='wminkowski', p=2,
metric_params={'w': np.random.random(X_train.shape[1])})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5861 次 |
| 最近记录: |