机器学习
1. 机器学习的引入
城市气候与海洋的关系研究 :
导入包 :
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
导入数据 :
ferrara1 = pd.read_csv('./ferrara_150715.csv')
ferrara2 = pd.read_csv('./ferrara_250715.csv')
ferrara3 = pd.read_csv('./ferrara_270615.csv')
ferrara=pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True)
# ignore_index=True 表示的是忽略显式的行索引
...
删除没用的列 :
# 循环删除每个表的'Unnamed: 0'列
city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
for city in city_list:
city.drop(labels='Unnamed: 0',axis=1,inplace=True) # 加入inplace=True就会改写源数据
部分数据 :
temp | humidity | pressure | description | dt | wind_speed | wind_deg | city | day | dist | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 29.40 | 83 | 1015 | moderate rain | 1436863177 | 3.62 | 94.001 | Faenza | 2015-07-14 10:39:37 | 37 |
1 | 30.12 | 78 | 1015 | moderate rain | 1436866759 | 3.10 | 80.000 | Faenza | 2015-07-14 11:39:19 | 37 |
显示最高温度于离海远近的关系(观察多个城市):
max_temp = [] #10个城市的最高温度
cities_dist = [] #10个城市距离海洋的距离
for city in city_list:
max_temp.append(city['temp'].max())
cities_dist.append(city['dist'].max())
- 在方程式中:
- x:自变量
- y:因变量
- y = 5x + 4
- 自变量的变化会导致因变量的变化
生成散点图 :
plt.scatter(cities_dist,max_temp,c='rbyg') # c='rbyg'表示颜色
plt.xlabel('距离')
plt.ylabel('最高温度')
plt.title('距离和最高温度之间的关系图')
# 基于当前的关系模式将某一个未知最高温度的城市的最高温度进行预测
机器学习
1. 机器学习 - 线性回归算法模型
- 机器学习(ML)和人工智能之间的关系是什么?
- 机器学习是实现人工智能的一种技术手段
- 什么是算法模型(model或者m)?
- 特殊的对象。特殊之处就在于该对象内部集成了某一种还没有求出解的方程。
- 算法模型的作用?
- 实现预测:预测出一个未知的结果
- 实现分类:将一个未知分类的事务归类到已知的类群中
- 重点:算法模型中的方程的解就是预测或者分类的结果
- 样本数据
- 作用:将样本数据带入到算法模型中让其内部的方程有解。至此算法模型就可以实现分类或者预测的功能。
- 训练模型:将样本数据带入到算法模型中让其内部的方程有解。只有训练好的算法模型才可以实现分类或者预测的功能!
- 组成部分:
- 特征数据:自变量
- 目标数据:因变量
- sk-learn库:封装了大量的算法模型
- 模型的分类:
- 有监督学习:如果模型需要的样本数据必须包含特征数据和目标数据
- 无监督学习:如果模型需要的样本只需要有特征数据
导入sklearn,建立线性回归算法模型对象
- 该模型内部封装的是一个线性方程:y = wx + b
-
提取样本数据(特征数据,目标数据)
feature = np.array(cities_dist) #特征数据 feature = feature.reshape(-1, 1) #二维形式的特征数据 target = np.array(max_temp) #目标数据
训练模型调用的方法是fit(X,y),y任意形式(维度)的目标数据,X表示的必须是二维的特征数据
-
选择一个模型对象进行实例化
from sklearn.linear_model import LinearRegression linner = LinearRegression()
-
训练模型
linner.fit(feature,target) # X,y X必须是二维的特征数据
-
使用相关的评价指标来评价模型
linner.score(feature,target)
-
实现预测
linner.predict([[222],[333]])
画出回归曲线 :
x = np.linspace(0,350,num=100)
y = linner.predict(x.reshape(-1,1))
plt.scatter(cities_dist,max_temp,c='rbyg')
plt.xlabel('距离')
plt.ylabel('最高温度')
plt.title('距离和最高温度之间的关系图')
plt.scatter(x,y)
2. K-近邻算法(KNN)
1. k-近邻算法原理
简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
- 优点:精度高(计算距离)、对异常值不敏感(单纯根据距离进行分类,会忽略特殊情况)、无数据输入假定(不会对数据预先进行判定)。
- 缺点:时间复杂度高、空间复杂度高。
- 适用数据范围:数值型和标称型。
2. 在scikit-learn库中使用k-近邻算法
用于分类 :
导包,机器学习的算法KNN、数据蓝蝴蝶
import sklearn.datasets as datasets
datasets.load_iris() # datasets提供了不同的样本数据,根据不同的样本数据训练出来,就将会有不同的功能
预测年收入是否大于50K美元 :
读取adult.txt文件,最后一列是年收入,并使用KNN算法训练模型,然后使用模型预测一个人的年收入是否大于50
# 读取数据
import pandas as pd
import numpy as np
data = pd.read_csv('../data/adults.txt')
data.head()
部分数据展示
age | workclass | final_weight | education | education_num | marital_status | occupation | relationship | race | sex | capital_gain | capital_loss | hours_per_week | native_country | salary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 39 | State-gov | 77516 | Bachelors | 13 | Never-married | Adm-clerical | Not-in-family | White | Male | 2174 | 0 | 40 | United-States | <=50K |
1 | 50 | Self-emp-not-inc | 83311 | Bachelors | 13 | Married-civ-spouse | Exec-managerial | Husband | White | Male | 0 | 0 | 13 | United-States | <=50K |
获取年龄、教育程度、职位、每周工作时间作为机器学习数据
获取薪水作为对应结果
feature = data[['age','education_num','occupation','hours_per_week']]
target = data['salary']
knn中特征数据是需要参与运算的,所以要保证特征数据必须为数值型的数据
feature.head(2)
age | education_num | occupation | hours_per_week | |
---|---|---|---|---|
0 | 39 | 13 | Adm-clerical | 40 |
1 | 50 | 13 | Exec-managerial | 13 |
数据转换,将String类型数据转换为int (occupation转换成数字)
# map方法,进行数据转换
dic = {}
occ_arr = feature['occupation'].unique()
for i in range(occ_arr.size):
dic[occ_arr[i]] = i
feature['occupation'] = feature['occupation'].map(dic)
切片:训练数据和预测数据
#训练数据
x_train = feature[:32500]
y_train = target[:32500]
#测试数据
x_test = feature[32500:]
y_test = target[32500:]
生成算法
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=10) # n_neighbors调整精度用的K
knn.fit(x_train,y_train)
knn.score(x_test,y_test)
第二步:预测数据
print('真实的分类结果:',np.array(y_test))
print('模型的分类结果:',knn.predict(x_test))
3. KNN手写数字识别
导包
import numpy as np
import matplotlib .pyplot as plt
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
加载数据
#./data/6/6_66.bmp
feature = []
target = []
for i in range(10): #i表示的文件夹的名称
for j in range(1,501):
img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp'
img_arr = plt.imread(img_path)
feature.append(img_arr)
target.append(i)
提取样本数据
feature = np.array(feature) #必须保证是二维
target = np.array(target)
feature.shape # (5000, 28, 28) 目前的特征是3维
特征处理:将三维的特征变形成二维
feature = feature.reshape((5000,-1))
feature.shape # (5000, 784)
对样本数据进行拆分
#对样本数据进行打乱
# 利用random进行随机打乱且固定随机因子,使数据保持对应关系
np.random.seed(10)
np.random.shuffle(feature)
np.random.seed(10)
np.random.shuffle(target)
#拆分
x_train = feature[:4950]
y_train = target[:4950]
x_test = feature[4950:]
y_test = target[4950:]
实例化模型对象,然后对其进行训练
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(x_train,y_train)
knn.score(x_test,y_test)
测试数据
print('真实的分类结果:',y_test)
print('模型的分类结果:',knn.predict(x_test))
保存模型
from sklearn.externals import joblib
joblib.dump(knn,'./knn.m')
使用模型识别外部的数字图片
读取模型
knn = joblib.load('./knn.m')
knn
读取需要识别的图片
img_arr = plt.imread('./数字.jpg')
plt.imshow(img_arr)
img_arr.shape # (241, 257, 3) 三维
裁切图片
eight_img = img_arr[180:235,90:130,:]
plt.imshow(eight_img)
feature[0].shape # (784,)
模型可以识别的图片的维度是取决于样本数据的
- 可以识别的图片是28*28像素
- 图片是没有颜色这个维度
- 模型识别的图片(784,)
降维
eight_img.shape # (55, 40, 3)
eight_img = eight_img.mean(axis=2)
eight_img.shape # (55, 40)
对降维之后的图片的像素进行等比例压缩
import scipy.ndimage as ndimage
eight_img = ndimage.zoom(eight_img,zoom=(28/55,28/40))
eight_img.shape # (28, 28)
eight_img = eight_img.reshape(1,-1)
eight_img.shape # (1,784)
识别
knn.predict(eight_img) # array([8])