基于KNN的分类模型-预测美团外卖城市等级

需求介绍

美团有自己的城市等级,外卖依据其业务体量,重新划分了外卖的城市等级。这个城市根据其业务情况来划分的,比较详细。

现在有以下样本数据。

city_namecity_levelpnumddl
临汾D2****
南京A****
洛阳C1****
无锡B1****

 

其中分别是城市名,城市等级(D2,A,C1,B1,C2,D3,B2,S,D1),动销门店量,月订单量。现在需要fit一个模型,要求再增加新的城市可以给分出一个合适的城市等级。

数据探查

首先在空间描述点的聚集离散程度。

import plotly.plotly as py
import pandas as pd
import  plotly

plotly.tools.set_credentials_file(username='your name', api_key='KCwJWZXjfSJ65bhCvc')
df = pd.read_csv('d:/src/waimaiknn.csv')
print(df.head())
print(df['pnum'])
scatter = dict(
    mode = "markers",
    name = "y",
    type = "scatter3d",
    x = df['city_level'], y = df['pnum'], z = df['ddl'],
    marker = dict( size=2, color="rgb(23, 190, 207)" )
)
clusters = dict(
    alphahull = 7,
    name = "y",
    opacity = 0.1,
    type = "mesh3d",
    x=df['city_level'], y=df['pnum'], z=df['ddl']
)
layout = dict(
    title = '3d point clustering',
    scene = dict(
        xaxis = dict( zeroline=False ),
        yaxis = dict( zeroline=False ),
        zaxis = dict( zeroline=False ),
    )
)
fig = dict( data=[scatter, clusters], layout=layout )
# Use py.iplot() for IPython notebook
py.plot(fig, filename='3d point clustering')

输出见: https://plot.ly/~junshan2009/16/_3d-point-clustering/#/ 

 

看到x坐标轴上的各个点聚集程度较好。

要求把数据划分为训练集和测试集,训练出模型后,用测试集测试训练效果。

数据准备

from sklearn.preprocessing import LabelBinarizer
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
import pandas as pd
import numpy as np

df = pd.read_table("d:/src/waimaiknn.txt")
pnum = np.array(df['pnum'][:-10])
ddl = np.array(df['ddl'][:-10])
x_train = np.column_stack((pnum, ddl))
print(x_train)
y_train = np.array(df['city_level'][:-10])
print(y_train)
x_test = np.column_stack((np.array(df['pnum'][-10:]), np.array(df['ddl'][-10:])))
y_test = np.array(df['city_level'][-10:])

 数据准备好后开始训练模型,并且选一个单例看看测试的效果

k = 3
clf = KNeighborsClassifier(n_neighbors=k)
clf.fit(x_train, y_train.reshape(-1))
dem1 = clf.predict(np.array([4576, 1611779]).reshape(1, -1))[0]
print('预测出的城市是', dem1, '级别')

单例出的结果正确,接下来我们评估模型的效果,分为准确度,精准度,召回率三个方面。

准确率,就是这个分类器预测准确的百分率

精准率一般存在于二元分类,比如预测是否得癌症,结果只有:癌症,没癌症。我们宁愿没癌症预测成了癌症,也不愿有癌症的给预测了没癌症。其中这个有癌症的被预测出来,而没有预测为没癌症就是精准率。

因为这个不是二元分类,所以本次不做精准率评估。

召回率,真正正向类被预测为正向类的比率。

y_pred = clf.predict(x_test)
print(x_test)
print(y_test)
print(y_pred)

print('这次预测的准确率是', metrics.accuracy_score(y_test, y_pred))
# print('这次预测的精准率', metrics.precision_score(y_test,y_pred,average=None))
# print('召回率',metrics.recall_score(y_test,y_pred))

可以看到,预测的还是比较准的,准确度60%,错误的情况是

D1-D2

D3-C2

C1-C2

D1-D2

其中D3-C2是比较严重的错误,其他属于接近的错误。

可能是这个城市当月业绩有突然上升,导致了其位置的提高。因为外卖城市分级是静态的,销售数据每个月不一样。

预测出这种结果,从业务的角度来说,已经比较准确了。

通过上面的点图我们发现,D1,D2的y,z周聚集位置较为接近,这也是为什么D1,D2容易误判的原因吧。理想的情况是,X轴上面的,y,z轴点的聚集没有交叉。

探索

k=3是否合理,实际上邻近算法的k值需要设置成奇数防止平局的现象。

设置K=5的时候结果是一样的,但是设置成1结果会大打折扣

所以合理设置k值可以自己探索一下。

KNN(K-Nearest Neighbors)是一种机器学习算法,可用于心脏病的分类预测KNN算法通过度量新样本与已知类别样本之间的距离来确定新样本的类别。 基于KNN进行心脏病分类预测的过程如下:首先,收集样本数据集,其中包含已知类别的心脏病患者和正常人的特征信息,例如年龄、性别、胆固醇水平等。然后,对于将要预测的新样本,计算它与已知类别样本之间的距离。一般情况下,可以使用欧几里得距离或曼哈顿距离等进行距离度量。接下来,选择K个最近的已知类别样本,即距离新样本最近的K个样本。 对于选定的K个最近邻样本,通过多数投票的方式确定新样本的类别。如果K个最近邻中心脏病患者的数量较多,则将新样本分类为心脏病。反之,如果正常人的数量较多,则将新样本分类为正常。在确定K值时,可以通过交叉验证等方法选择最优的K值。 基于KNN的心脏病分类预测具有一定的优点和限制。优点是简单易实现,不需要对样本分布进行假设,能够处理多分类问题。限制则是计算复杂度较高,对异常值和噪声敏感,对样本不平衡问题处理较为困难。 总之,基于KNN的心脏病分类预测通过计算新样本与已知类别样本之间的距离,利用多数投票方法确定新样本的类别。运用KNN算法可以进行心脏病的预测,但在实际使用中需要注意其限制并进行适当的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值