Python 中的 K-nn 没有库

K-nn in Python without libraries

提问人:Steplet 提问时间:11/16/2023 最后编辑:Steplet 更新时间:11/16/2023 访问量:57

问:

我实现了一个没有像 sklearn 这样的库的 K-nn 模型。动作逻辑如下:

  1. 对数据进行规范化。
  2. 将数据分为测试数据和训练数据。
  3. 计算点与测试样本的距离。
  4. 计算相同最近邻类的数量。
  5. 做出预测。
  6. 计算预测数,然后除以测试样本总数。

没有sklearn的程序的准确性: 0.9444444,k = 5

使用 sklearn: 1.0,k = 5

为什么不相等?

数据

wine = sklearn.datasets.load_wine()
data = pd.DataFrame(wine.data, columns=wine.feature_names)
data['Wine'] = wine.target

data_norm = (data.drop('Wine', axis=1)-data.drop('Wine', axis=1).min()) / (data.drop('Wine', axis=1).max () - data.drop('Wine', axis=1).min())

data_norm.insert(loc=len(data.columns)-1, column='Wine', value=data['Wine'])

功能:

def dist(data, x):
  list_t = []
  for i in range(len(data)):
    dist = 0
    for j in range(len(data.iloc[i]) - 1):
      dist += (x[j] - data.iloc[i][j])**2
    dist = math.sqrt(dist)
    list_t.append([data['Wine'].iloc[i], dist])
  return list_t
def predict(data):
  count = {}
  for i in data:
    if i[0] in count:
      count[i[0]] += 1
    else:
      count[i[0]] = 1
  return max(count.items())[0]
def acc(data, test):
  count = 0
  for i in range(len(data)):
    if data[i] == test.iloc[i]:
      count += 1
  return (count / len(test))

主要:

y = data_norm['Wine']
X_train, X_test, y_train, y_test = train_test_split(data_norm, y, test_size = 0.3, random_state = 0)
p = []
for i in range(len(X_test)):
  dists = dist(X_train, X_test.iloc[i])
  dists_sort = sorted(dists, key=lambda x:x[1])
  dists_sort = dists_sort[:5]
  # print(dists_sort)
  p.append(predict(dists_sort))

数据集: 葡萄酒数据集

正常化:最小MaxScaler

Python 机器学习 scikit-learn knn

评论

0赞 JustLearning 11/16/2023
提供 的定义以重现代码。data_norm
0赞 Steplet 11/16/2023
data = pd.read_csv('WineDataset.csv')
0赞 Steplet 11/16/2023
data_norm = (data.drop('Wine', axis=1)-data.drop('Wine', axis=1).min()) / (data.drop('Wine', axis=1).max () - data.drop('Wine', axis=1).min()) data_norm.insert(loc=len(data.columns)-1, column='Wine', value=data['Wine'])
0赞 JustLearning 11/16/2023
我建议你把你的代码改成人们可以复制的东西。特别是,我们无法访问您的 CSV 文件。如果这是 sklearn 的 wine 数据集,那么最好的办法是修改代码以使用数据集本身:wine = sklearn.datasets.load_wine()
1赞 desertnaut 11/16/2023
欢迎来到 SO;请不要在评论中发布代码 - 它实际上是不可读的!而是编辑和更新您的问题。

答: 暂无答案