用K近邻算法建立一个超简单的预测模型365bet手机app下载

那篇作品紧要讲八个事:

  1. 给大家介绍一下机械学习中的一个简单算法-K近邻算法
  2. 广泛一个冷门专业——选矿

明日依靠一些选矿的数额来讲一下以此算法。

选矿是怎么的?选矿就是探究怎样从矿石中把实用的矿物提取出来的一门学科。选矿之前要先把矿石弄成粉末,让矿石中的有用矿物和别的垃圾分开,然后再使用有用矿物和任何杂志之间的物理化学品质差别将它们分别。
俺们今天使用的那个多少是有关磁铁矿的,在那一个磁铁矿山中,开采出来的原矿石里面有诸多屏弃物,黄铁矿、赤铁矿、石英、云母、绿泥石、三元石……偶尔还可以发现价值连城的纯天然绿松石……

下边简单介绍一下数码含义:

  1. BallMillAbility:球磨机台时能力,可以驾驭为每台机械每时辰磨出来的矿粉的量;
  2. OreGrade:原矿品位,相当于原矿中的铁成分含量;
  3. RateofMagnet:磁铁率,即在拥有铁矿物(磁铁矿、黄铁矿、赤铁矿、褐铁矿等)中磁铁矿所占的比例;
  4. TailGrade:尾矿品位,尾矿就是选矿之后暴发的渣渣;
  5. ConcentrateGrade:精矿品位,就是选矿的最终产品,那些目标在选矿厂是严厉控制的,一般波动唯有1%。64%程度的磁石精矿意味着磁铁矿含量已经达标了88%。

我们前些天做的展望模型就是要透过那目前4个目标来预测第5个目标是不是落成

读取csv文件:

In [1]:import pandas as pd
In [2]:df = pd.read_csv('D://Practice/Data.csv')
In [3]:df
Out[3]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0             297.76     18.98         71.65       8.30             64.35
1             280.15     18.68         73.39       8.59             64.87
2             302.81     18.23         72.13       8.69             64.76
3             173.41     19.55         74.42       9.00             64.57
4             345.66     18.57         75.93       9.28             64.62
5             312.65     18.34         72.19       9.19             64.38
6             306.85     17.80         71.80       9.35             64.50
..               ...       ...           ...        ...               ...
推断目的处理

将最后一列提取出来,作为每一列的归类标签(其中64.5之上为合格(1),64.5以下为不沾边(0))

for i in range(149):
    if df['ConcentrateGrade'][i] >= 64.5:
        df['ConcentrateGrade'][i] = 1
    else:
        df['ConcentrateGrade'][i] = 0

Out[13]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0             297.76     18.98         71.65       8.30               0.0
1             280.15     18.68         73.39       8.59               1.0
2             302.81     18.23         72.13       8.69               1.0
3             173.41     19.55         74.42       9.00               1.0
4             345.66     18.57         75.93       9.28               1.0
5             312.65     18.34         72.19       9.19               0.0
6             306.85     17.80         71.80       9.35               1.0
..               ...       ...           ...        ...               ...
雁过拔毛的展望样本(那里只留了一个,实际选择的时候需求较多数据):
BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
  340.22     17.08         66.66       9.30           --
计量距离并按距离排序

求那一点到多少汇总各点的距离,并将以此距离值作为一列新的数量出席到df中。

df['Distance'] = 0
from numpy import *
for i in range(149):
    distance = sqrt((df['BallMillAbility'][i]-350.22)**2+(df['OreGrade'][i]-17.08)**2+(df['RateofMagnet'][i]-65.65)**2+(df['TailGrade'][i]-10.30)**2)
    df['Distance'][i] = distance

排序

a = df.sort(columns = 'Distance')#这里记住对调用df的sort方法不会对df做出改变。

       BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade   Distance  
99            349.90     17.44         68.06       8.50               0.0           3  

40            349.49     17.03         69.76       8.49               0.0           4  

10            352.13     17.41         70.53       8.82               1.0           5  

100           351.63     18.48         71.81       8.46               1.0           6  

65            355.82     16.92         70.51       7.52               0.0           7  

104           347.20     18.76         71.59       8.75               0.0           7  

113           350.17     18.75         73.23       9.04               0.0           7  

46            352.35     18.13         71.98       8.18               0.0           7
 ..               ...       ...           ...        ...               ...
预测

365bet手机app下载,接下来取前k个值(大家取20),计算前k个值中1占多少。

b = a.reset_index(drop = True)#这里要重新建立索引,以便后续操作。另:使用a的reset_index方法不会改变a的值
m = 0
for i in range(20):
    if b['ConcentrateGrade'][i] == 1:
        m += 1
In[46]:m
Out[46]: 9

看得出前20组数据中,ConcentrateGrade小于64.5的占多数,大家继承加大k的值试试:

k  20 30 40 50
m  3  6 10 12

通过测试结果大家得以判明,那趟目的应该不见面格。

在做预测模型的时候,为了防止数据量纲对模型的熏陶,大家会对数码举办归一化处理

数量归一化处理

那边运用最简便易行的景色函数归一化(Min-马克斯 Scaling)

365bet手机app下载 1

p = min(df['BallMillAbility'])
o = max(df['BallMillAbility'])
for i in range(149):
    df['BallMillAbility'][i] = (df['BallMillAbility'][i]-p)/(o-p)

似乎此逐一把4列数据都归一化

Out[33]: 
     BallMillAbility  OreGrade  RateofMagnet  TailGrade  ConcentrateGrade
0           0.508755  0.526555      0.418244   0.325203               0.0
1           0.436707  0.481032      0.567986   0.443089               1.0
2           0.529417  0.412747      0.459552   0.483740               1.0
3           0.000000  0.613050      0.656627   0.609756               1.0
4           0.704730  0.464340      0.786575   0.723577               1.0
5           0.569675  0.429439      0.464716   0.686992               0.0
6           0.545946  0.347496      0.431153   0.752033               1.0
7           0.305294  0.391502      0.555077   0.609756               0.0
8           0.594509  0.335357      0.444062   0.776423               1.0
9           0.506505  0.074355      0.302926   0.691057               1.0
..               ...       ...           ...        ...               ...

归一化处理完了后来别忘记保存一下

df.to_csv('D://Practice/data1.csv')

接下来大家再用k近邻算法计算五回拿到如下结果:

k 20 30 40 50
m 3 9 19 31

诸如此类又出现了差别的结果,理论上来讲,归一化之后的展望模型应该更加可信一点。

ps:对选矿有趣味的可以私信我

发表评论

电子邮件地址不会被公开。 必填项已用*标注