微信公众号:萝卜大杂烩 关注可了解更多的原创内容。算法
机器学习,是人工智能(AI)的一部分。是研究如何让计算机从数据中学习某种规律的科学。数组
能够简单的总结成公式为:bash
历史数据 + 计算机成功 = 算法模型
将来数据 + 算法模型 = 预测将来事件微信
监督式学习网络
须要给每一个样品打标签,训练数据包含输入和预期的输出。dom
非监督式学习机器学习
不须要标签,训练数据只有输入,没有预期的输出。函数
分类的实例应用:学习
回归的实例应用:测试
聚类的实例应用:
收集数据 到一些大数据网站或者本身公司软件收集到的数据。
数据清洗 对获得的数据,作一些检查,查看是否有明显错误数据,空数据等。
特征工程 把数据作一些变换,使得数据可以被程序识别,通常是向量化,提取特征。
数据预处理 把数据处理成容易被程序识别的形式,如归一化,标准化等。
选择算法模型 须要选择合适的算法模型
训练调参 是一个迭代的过程,不断训练,来达到模型的最优。
模型部署 在线部署。
在一个真实的对象中,提取出咱们关心的特征。好比物体的形状,体积等。文字的出现位置等。
对于数据集中的缺失值,须要根据相关信息,来处理缺失数据。使用均值、中间值,或者众数、类似数等方式来填充缺失值,固然若是缺失值太高,直接丢弃也是能够的。
归一化和标准化 归一化:把数据归一化为0到1之间 标准化:把数据标准化为正态分布数据
独热编码: 把数据变换为0或1的值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
复制代码
使用 pandas 读取 csv 文件
data = pd.read_csv('Advertising.csv')
data.head()
复制代码
output
使用图表来展现数据,这样可以更加直观的查看数据分布等信息
plt.figure(figsize=(16, 8))
plt.scatter(data['TV'], data['sales'], c ='black')
plt.xlabel("Money spent on TV ads")
plt.ylabel("Sales")
plt.show()
复制代码
output
海拔高度与温度的预测练习
h_data = pd.read_csv('height.csv')
h_data
plt.figure()
plt.scatter(h_data['height'], h_data['temperature'])
plt.xlabel('height')
plt.ylabel('temperature')
plt.show()
h_X = h_data['height'].values.reshape(-1, 1)
h_y = h_data['temperature'].values.reshape(-1, 1)
h_reg = LinearRegression()
h_reg.fit(h_X, h_y)
print("线性模型为: Y = {:.5}X + {:.5} ".format(h_reg.coef_[0][0], h_reg.intercept_[0]))
h_height = h_reg.predict([[8000]])
h_height[0][0]
复制代码
作 K 最近邻算法,若是样本总共分为 N 类,若是一个未知分类点,距离某一类的距离最近,则该点属于该类。
K 通常取值为奇数值,表明选取 K 个点的距离。
kNN 算法的核心思想是若是一个样本在特征空间中的 k 个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具备这个类别上样本的特性。--来自百度百科
欧式距离的计算:
二维平面上两点 a(x1,y1) 与 b(x2,y2) 间的欧氏距离:
三维空间两点 a(x1,y1,z1)与b(x2,y2,z2) 间的欧氏距离:
两个 n 维向量 a(x11,x12,…,x1n) 与 b(x21,x22,…,x2n) 间的欧氏距离:
计算欧式距离
def euc_dis(instance1, instance2):
dist = np.sqrt(sum((instance1 - instance2)**2))
return dist
复制代码
dist 的计算就是,求两个向量差的平方和,再取平方根。
咱们可使用 numpy 库自带的公式来验证下
import numpy as np
def euc_dis(instance1, instance2):
dist = np.sqrt(sum((instance1 - instance2)**2))
return dist
vec1 = np.array([2, 3])
vec2 = np.array([5, 6])
euc_dis(vec1, vec2)
np.linalg.norm(vec1 - vec2)
复制代码
最后的结果都是 4.242640687119285
实现 KNN 算法
def knn_classify(X, y, testdata, k):
distances = [euc_dis(x, testdata) for x in X]
kneighbors = np.argsort(distances)[:k]
count = Counter(y[kneighbors])
return count.most_common()[0][0]
复制代码
argsort 函数返回的是数组值从小到大的索引值,most_common 函数用来实现 Top n 功能。
来看下这两个函数的具体实例
argsort
test_data1 = np.array([2, 1, 5, 0])
np.argsort(test_data1)
复制代码
output
array([3, 1, 0, 2], dtype=int32)
复制代码
返回的数组依次为最小值0的索引位置3,依次类推
most_common
from collections import Counter
test_data2 = Counter("abcdabcab")
test_data2.most_common(2)
复制代码
output
[('a', 3), ('b', 3)]
复制代码
返回出现次数最多的 top n
使用手写的 KNN 算法作预测
# 导入iris数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)
# 预测结果。
predictions = [knn_classify(X_train, y_train, data, 3) for data in X_test]
print(predictions)
correct = np.count_nonzero((predictions==y_test)==True)
print(correct)
print ("Accuracy is: %.3f" %(correct/len(X_test)))
复制代码
能够将决策边界一侧的全部点分类为属于一个类,而将另外一侧的全部点分类为属于另外一个类。决策边界选择的好坏,直接影响着模型预测的准确程度。
总结:决策边界过于粗糙,会致使欠拟合,而过于精细,就会有过拟合的风险。
KNN算法中的决策边界,就是肯定 K 的值,到底选取 K 为几才是最优的解。
为了肯定 K 的值,能够采用交叉验证的方式。 首先,当咱们拿到一组数据以后,先把数据拆分为训练集和测试集,训练集用于训练模型,测试集用于测试模型的准确率。
测试集不可用于训练!测试集不可用于训练!测试集不可用于训练!(重要的事情吼三遍)
而后,再把训练集拆分红训练集和验证集。这里的验证集,是用来给交叉验证时使用的。
好比,若是咱们想作5轮交叉验证,那么就分别把最原始的训练集分红5中状况,如图:
接着,分别取 K=1,K=3,K=5 等状况在上述5种数据集中分别训练验证,得出准确率最高的 K 值,此时,咱们就经过交叉验证的方式,找到了在该数据集下的最优 K 值。
最后,才会在测试集上作最后的测试,若是模型在测试集上达到了咱们预期的准确率,则模型可用。
欢迎关注个人微信公众号--萝卜大杂烩,或者扫描下方的二维码,你们一块儿交流,学习和进步!