我想编写一个函数,它使用数据数据和knn算法,使用下面的dist函数作为度量,以估计新客户的信用请求是否会被接受。
import pandas as pd
import math
import sklearn
data = pd.DataFrame({
'Loan' : [52000, 100000, 97000, 62000],
'DerogatoryMarks' : [0, 2, 0, 5],
'Accepted' : [True, True, False, True]
},
columns = ['Loan', 'DerogatoryMarks', 'Accepted']
)
# Dist function
def dist(data_loan, data_derogatory, test_loan, test_derogatory):
return math.sqrt((data_loan - test_loan) ** 2 +
100000000 * (data_derogatory - test_derogatory) ** 2)
# Testing the function
print(function(data, 85000, 1, 1)) # This should return False我的尝试:
def function(data, loan, derogatory_marks, k):
# Locate neighbors
distances = list()
for data_row in data:
dist = dist(test_loan, data_loan)
distance.append((data, dist))
distances.sort(key=lambda tup: tup[1])
neighbors = list()
for i in range(num_neighbors):
neighbors.append(distances[i][0])
# Predictions
output_values = [row[-1] for row in neighbors]
prediction = max(set(output_values), key=output_values.count)
return prediction我做错什么了?
发布于 2022-06-18 09:26:08
欢迎来到这里!
您的代码有几个问题:
dist.
dist,当它需要4个参数时,只调用带有两个参数的函数dist。
test_loan、data_loan、distance、num_neighbors)。H 213F 214看起来您正在尝试(1)在distances中存储从输入数据到行中的每个数据的距离,以及相关的结果作为元组存储,(2)按照每个元组中的第一个元素对distances进行排序,(3)只保留排序列表中的第一个k项。我们可以这样做:
distances = sorted(
[
(
dist(
loan,
derogatory_marks,
row.Loan,
row.DerogatoryMarks,
),
row.Accepted,
)
for row in data.itertuples()
],
key=lambda t: t[0],
)[0:k](我使用data.itertuples作为命名元组遍历行,这允许我使用像row.Accepted这样的表达式方便地访问行数据。我们也可以以其他方式访问行数据。)
然后,您希望返回元组列表中最常见的布尔值。Python将True视为1,而False在幕后将其视为0,因此我们只需返回以下内容:
return sum(choice for _, choice in distances) / k >= 0.5https://stackoverflow.com/questions/72667221
复制相似问题