0. 流程
- 实例化使用的模型类,得到一个模型对象
- 对象.fit(feature, target), 训练模型
- 对象.predict(data),得到预测的target值
1. 城市气候与海洋的关系研究
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 同一城市的数据进行级联
pd.concat([df1, df2, df3], ignore_index=True)
plt.scatter(li1, li2)
plt.xlabel = 'distance'
plt.ylabel = 'temperature'
plt.title = 'dis-temp'
2. sklearn模块
- Anaconda 中集成
- 线性模型
- 树模型
1. 概念
- 人工智能和机器学习之间的关系
- 机器学习是实现人工智能的一种技术手段
- 算法模型
- 概念:特殊对象该对象内部封装了某种还没有求出解的方程
- 作用:实现预测或分类
- 对象内部封装的方程的解就是算法模型预测或分类的结果
- 分类
- 有监督学习:如果算法模型对象需要的样本数据必须有特征数据和目标数据
- 无监督学习:只需要特征数据即可
- 样本数据
- 训练模型:样本数据和算法模型之间的关系(需要将样本数据带入到模型对象中,让模型对象的方程求出解)
- 算法模型的样本数据:千亿级别的样本数据
- 样本数据:由特征数据(自变量,往往是由多种特征组成)和目标数据(因变量)组成
2. 线性回归算法模型(预测)
# 建立一个温度模型,让其可以根据距离,预测出该距离对应城市的最高温度
# 导入sklearn,建立线性回归模型
from sklearn.linear_model import LinearRegression
# 实例化算法模型对象, y = kx + b
linear = LinearRegression()
# 样本数据提取,一般封装到 np的 array 中
feature = np.array(distance)
target = np.array(max_temp)
# 训练模型,特征数据必须是二维的
linear.fit(feature.reshape(-1,1), target)
# 基于训练好的模型对象实现预测功能(获取方程解)
linear.predict([[266],[333]])
x = np.linspace(0, 400, num=100)
y = linear.predict(x.reshape[-1,-1])
plt.scatter(distance, max_temp)
plt.scatter(x, y)
3. KNN(分类算法模型)
1. k-近邻算法原理
- 俗称:k近邻、K:数值,N:nearest,N:neighbor
- 欧几里德距离:Euclidean Distance
- 简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
- 优点:精度高、对异常值不敏感、无数据输入假定。
- 缺点:时间复杂度高、空间复杂度高。
- 适用数据范围:数值型和标称型。
2. 工作原理
- 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
- 使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。
3. 在scikit-learn库中使用k-近邻算法
- 分类问题:from sklearn.neighbors import KNeighborsClassifier
- 回归问题:from sklearn.neighbors import KNeighborsRegressor
# scikit-learn库库中使用k-近邻算法
df = pd.read_csv('./film.txt')
feature = df[['Action lens'],['Love lens']]
target = df['target']
# 导入模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(feature, target)
# knn模型训练打分结果
knn.score(feature, target)
knn.predict([[30], [50]])
4. sklearn提供的数据
- 提供机器学习的测试数据
# 提供机器学习的测试数据
from sk-learn.datasets as datasets
datasets.load_iris()
# 训练数据
x_train = feature[0:32500]
y_train = target[0:32500]
# 测试数据,测试模型的精准度
x_test = feature[32500:]
y_test = target[32500:]
# 实例化模型
knn = KNeighborsClassifier(n_neighbors=30)
knn.fit(x_train, y_train)
knn.score(x_train, y_train)
# 测试模型精准度
print(knn.predict(x_test), y_test)
3. 手写数据识别(示例)
- 图片数据是二维的,放入list中,在转换为 array 时,就会变成三维数组
- 先把把图片数组转换为一维数组即可
- 样本数据的训练数据必须是二维的
- 降维操作:df.mean(axis=2) axis表示去掉哪一维数据
-
图片的像素压缩
-
import scipy.ndimage as ndimages
-
ndimages(df, zoom=(目标像素/当前图片像素,目标像素/当前图片像素))
-
df.reshape((1, -1)):转换为 1 * n 的数组
-
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearing.neighbors import KNeighborsClassifier
# 1.提取样本数据
feature = []
target = []
for i in range(10):
for j in range(1, 501):
img_path = f'./data/{i}/{i}_{j}.bmp'
img_arr = plt.imread(img_path)
feature.append(img_arr)
target.append(i)
# 2.将list类型样本转为 array 形式
feature = np.array(feature)
target = np.array(target)
# 3.特征数据是三维的,不可作为训练数组,必须转换成二维数组
feature = feature.reshape((5000, 784))
# 只能固定一个随机函数的随机因子
np.random.seed(10)
np.random.shuffle(feature)
np.random.seed(10)
np.random.shuffle(feature)
# 训练数据和测试数据
x_train = feature[:4980]
y_train = target[:4980]
x_test = feature[4980:]
y_test = target[4980:]
# 4.生成训练模型
knn = KNeighborsClassfier(n_negihbors=17)
knn.fit(x_train, y_train)
knn.score(x_train, y_train)
print(knn.predict(x_test))
print(y_test)
# 5.将训练好的模型进行保存
from sklearn.externals import joblib
joblib.dump(knn, './knn.m')
# 加载保存的模型
knn = joblib.load('./knn.m')
# 6.让模型对外部一张图片进行识别(应用)
ex_img = plt.imread('./test.jpg')
# 将多个数字进行裁剪
img_two = ex_img[:70,130:185,:]
# 外部图片数据是三维,实现降维
img_two = img_two.mean(axis=2)
# 像素调整,等比例压缩
import scipy.ndimage as ndimages
img_two = ndimage.zoom(img_two, zoom=(28/75, 28/55))
# 将图片转换为一维数组
img_two = img_two.reshape((1, -1))
knn.predict(img_two)