本文为博主学习机器学习时所做的笔记以及实验的代码,学习内容来自heimachengxuyuan.如有错误请多指教。
基础内容
概念
机器学习是通过一系列的变量来获取预测下一时间的值,输入称作feature(特征值),结果为label(结果标签),其中映射关系或者函数叫做算法,我们的主要问题就是通过编程来实现这个算法。
影响预测的因素
1、预测模型的参数不够好(调参)
2、影响因子不够多(增加数据维度)
3、样本数据量不够多(增加样本量)
4、预测模型选的不够好(更换模型)
基本算法
Knn模型基础理解
使用python的numpy库,以及collection库实现。例子:投掷弹子玩具,当你投掷一个弹子时,会落入不同的奖品池子,我们想要预测投掷位置为200(feature)时的会获得的奖品时,则先随机投掷一系列的弹子,获得奖品结果(标签值),再计算这些弹子位置距离200的大小(distance),再根据distance从小到大排序,获得距离200接近时的最大概率奖品,示意代码如下:
import numpy as np
import collections as c
data =np.array([
[154, 1],
[126, 2],
[70, 2],
[196, 2],
[161, 2],
[371, 4]
])
#输入值
feature = data[:, 0]
#结果label
label = data[:, -1]
#预测点位置
predictPoint = 200
#计算随机实验距离
distance = (list(map(lambda x: abs(predictPoint-x), feature)))
print(distance)
#返回从小到大排序的下标的位置
sortindex = (np.argsort(distance))
#返回最接近的结果的排序
sortlabel = (label[sortindex])
#k个最接近的邻居
k = 3
print(c.Counter(sortlabel[0:k]).most_common(1)[0][0])
获得结果为
[46, 74, 130, 4, 39, 171]
2
封装knn函数
代码如下
import numpy as np
import collections as c
#抽取knn函数
def knn(k, predictPiont, feature, label):
# 计算随机实验距离
distance = (list(map(lambda x: abs(predictPiont - x), feature)))
# 返回从小到大排序的序列的下标位置
sortindex = (np.argsort(distance))
# 返回最接近结果的排序
sortlabel = (label[sortindex])
# 返回k个最接近的邻居
return (c.Counter(sortlabel[0:k]).most_common(1)[0][0])
if __name__ == '__main__':
data = np.array([
[154, 1],
[126, 2],
[70, 2],
[196, 2],
[161, 2],
[371, 4]
])
# 输入值
feature = data[:, 0]
# 结果label
label = data[:, -1]
# 预测点位置
predictPiont = 200
k = 3
print(knn(k, predictPiont, feature, label))
通过numpy倒入csv文件
import numpy as np
data = np.loadtxt("data0.csv", delimiter=",")
评估模型准确性
训练数据集(trainData)和测试数据集(testData)
#处理数据,把数据充分打散,拆分成测试集与训练集
import numpy as np
#将原始数据导入并赋值给data
data = np.loadtxt("data0.csv", delimiter=",")
#打散原始数据
np.random.shuffle(data)
testData = data[0:100]
trainData = data[100:-1]
#保存测试数据
np.savetxt("data0_test.csv", testData, delimiter=",", fmt="%d")
#保存训练数据
np.savetxt("data0_train.csv", trainData, delimiter=",", fmt="%d")
训练与评估
将k设置为3时代码如
traindata = np.loadtxt("data0_train.csv",delimiter=",")
# 输入值
feature = traindata[:, 0]
# 结果label
label = traindata[:, -1]
# 预测点位置
testdata = np.loadtxt("data0_test.csv", delimiter=",")
for item in testdata:
predict = knn(3,item[0],feature,label)
real = item[1]
count = 0
if real ==predict;
count = count+1
print("准确率为{}%".format(count*100.0/len(testdata)))
不断改变k的值,写一个循环函数可得不同k值的准确率比较,选择最优k。当数据分布比较均匀且数据量较大时,前人的经验告诉我们,k值可取数据量大小的开平方为最优值。
未完待续。。。。