我对Python和机器学习还比较新手,但我一直在努力构建一个预测抵押贷款价格的模型。我遇到的困难是使用K最近邻算法来创建一个特征。
以下是我对想要实现的机制的理解:
- 我有两个数据文件:已售抵押贷款和挂牌抵押贷款
- 在这两个数据文件中,我有相同的特征(包括经纬度)。
- 我想在挂牌抵押贷款中创建一个列,代表周边地区最相关房屋的中位价格。
- 我将使用第3点中提到的方法为1-3个月、4-6个月、7-12个月创建列。
- 另一个列将是这三个列的趋势。
我找到了关于KNN插补的一些资料,但那似乎不是我想要的。
我该如何执行这个想法呢?我是否错过了可以帮助我的资源?
任何指导都将不胜感激。谢谢!
回答:
所以,据我所知,你想使用已售抵押贷款数据来拟合KNN模型,以预测挂牌抵押贷款的价格。这是一个经典的KNN问题,你需要为挂牌数据中的每个特征向量在已售数据中找到最接近的特征向量,然后取这些特征向量的中位数。
-
假设已售数据中有n行,每行的特征向量分别为X1, X2, …, Xn,对应的价格为P1, P2, …, Pn
X_train = [X1, X2, ..., Xn]
y_train = [P1, P2, ..., Pn]
-
请注意,每个Xi本身就是一个特征向量,代表第i行的数据
-
目前,假设你希望为挂牌数据中的每一行找到已售数据中5个最接近的行。所以,这里需要优化的一个KNN模型参数是:
NUMBER_OF_NEIGHBOURS = 5
-
现在,训练代码看起来会像这样:
from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier(n_neighbors=NUMBER_OF_NEIGHBOURS)
knn_model.fit(X_train, y_train)
-
对于预测,假设挂牌数据中有m行,每行的特征向量分别为F1, F2, …, Fm。需要确定对应的中位价格Z1, Z2, …, Zm。
X_test = [F1, F2, ..., Fm]
-
请注意,X_train和X_test中的特征向量应使用相同的向量化器/变换器进行向量化。关于向量化器的更多信息,请阅读这里。
-
预测代码看起来会像这样:
y_predicted = knn_model.predict(X_test)
-
这个y_predicted列表的每个元素将包含(在这种情况下)来自y_train的5个最接近的价格。即:
y_predicted = [(P11, P12, .., P15), (P21, P22, .., P25), .., (Pm1, Pm2, .., Pm5)]
-
对于y_predicted的第j个元素:
import numpy as np
Zj = np.median(np.array([Pj1, Pj2, .., Pj5]))
-
因此,通过这种方式,你可以为挂牌数据的每一行找到中位价格Zj
-
现在,谈到参数优化部分。你的KNN模型中唯一的超参数将是NUMBER_OF_NEIGHBOURS。你可以通过将X_train本身按80:20的比例划分来找到这个参数的最佳值。在80%的部分上训练,并在剩余的20%的部分上进行交叉验证。一旦你确定准确率足够好,你就可以使用这个超参数NUMBER_OF_NEIGHBOURS的值来对y_test进行预测。
-
最后,对于按月分析,你需要创建按月的模型。例如,M1 = 基于1-3个月已售数据训练,M2 = 基于4-6个月已售数据训练,M3 = 基于7-12个月已售数据训练,等等。
参考:http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html