数据分析---Sklearn模块(Linner和KNN)
Sklearn模块
1.简介
Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习问题时,便可根据下图来选择相应的方法。Sklearn具有以下特点:
-
- 简单高效的数据挖掘和数据分析工具
- 让每个人能够在复杂环境中重复使用
- 建立NumPy、Scipy、MatPlotLib之上
Sklearn包括了十多种算法模型:LInner>>>线性回归方程、KNN>>>K-临近算法
2.Sklearn安装
Sklearn安装要求Python(>=2.7 or >=3.3)
、NumPy (>= 1.8.2)
、SciPy (>= 0.13.3)
。如果已经安装NumPy和SciPy,安装scikit-learn可以使用pip install -U scikit-learn
。
3.Sklearn流程
-
创建对象>>>
from sklearn.linear_model import LinearRegression #引入线性回归模型
from sklearn.neighbors import KNeighborsClassifier#引入线性回归模型
-
训练>>>
数据预处理--交叉验证(训练集Train、测试集Test)--数据封装提取(样本Feature、目标Target)--模型拟合(修正)--保存模型(from sklearn.externals import joblib#保存 joblib.dump(knn,'./knn.m' )
-
求解>>>读取
knn = joblib.load('./knn.m') 带哦用 knn.fit
4.案例
一、城市气候与海洋的关系研究
导入包
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt 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,ferrara1,ferrara1],ignore_index=True) torino1 = pd.read_csv('./torino_150715.csv') torino2 = pd.read_csv('./torino_250715.csv') torino3 = pd.read_csv('./torino_270615.csv') torino = pd.concat([torino1,torino2,torino3],ignore_index=True) mantova1 = pd.read_csv('./mantova_150715.csv') mantova2 = pd.read_csv('./mantova_250715.csv') mantova3 = pd.read_csv('./mantova_270615.csv') mantova = pd.concat([mantova1,mantova2,mantova3],ignore_index=True) milano1 = pd.read_csv('./milano_150715.csv') milano2 = pd.read_csv('./milano_250715.csv') milano3 = pd.read_csv('./milano_270615.csv') milano = pd.concat([milano1,milano2,milano3],ignore_index=True) ravenna1 = pd.read_csv('./ravenna_150715.csv') ravenna2 = pd.read_csv('./ravenna_250715.csv') ravenna3 = pd.read_csv('./ravenna_270615.csv') ravenna = pd.concat([ravenna1,ravenna2,ravenna3],ignore_index=True) asti1 = pd.read_csv('./asti_150715.csv') asti2 = pd.read_csv('./asti_250715.csv') asti3 = pd.read_csv('./asti_270615.csv') asti = pd.concat([asti1,asti2,asti3],ignore_index=True) bologna1 = pd.read_csv('./bologna_150715.csv') bologna2 = pd.read_csv('./bologna_250715.csv') bologna3 = pd.read_csv('./bologna_270615.csv') bologna = pd.concat([bologna1,bologna2,bologna3],ignore_index=True) piacenza1 = pd.read_csv('./piacenza_150715.csv') piacenza2 = pd.read_csv('./piacenza_250715.csv') piacenza3 = pd.read_csv('./piacenza_270615.csv') piacenza = pd.concat([piacenza1,piacenza2,piacenza3],ignore_index=True) cesena1 = pd.read_csv('./cesena_150715.csv') cesena2 = pd.read_csv('./cesena_250715.csv') cesena3 = pd.read_csv('./cesena_270615.csv') cesena = pd.concat([cesena1,cesena2,cesena3],ignore_index=True) faenza1 = pd.read_csv('./faenza_150715.csv') faenza2 = pd.read_csv('./faenza_250715.csv') faenza3 = pd.read_csv('./faenza_270615.csv') faenza = pd.concat([faenza1,faenza2,faenza3],ignore_index=True)
#去除没用的列 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)
显示最高温度于离海远近的关系(观察多个城市)
max_temp = [] city_dist = [] for city in city_list: temp = city['temp'].max() max_temp.append(temp) dist = city['dist'].max() city_dist.append(dist)
plt.scatter(city_dist,max_temp) plt.xlabel('距离') plt.ylabel('温度') plt.title('海滨城市最高温度和离还远近之间的关系')
分析:
需求:需要对当前的数据建立一个算法模型,然后可以让模型实现预测的功能(根据距离预测最高温度)。 y = wx + b线性方程,改方程还没有求出解 如果方程中的w和b是已知的,则改方程就有解 人工智能和机器学习之间的关系是什么? 机器学习是用来实现人工智能的一种技术手段 算法模型 概念:特殊的对象。特殊之处就在于该对象内部已经集成或者封装好一个某种方程(还没有求出解的方程) 作用:算法模型对象最终求出的解就是该算法模型实现预测或者分类的结果 预测 分类 样本数据:numpy,DataFrame 样本数据和算法模型之间的关联:样本数据是需要带入到算法模型对象中对其内部封装的方程进行求解的操作。该过程被称为模型的训练。 组成部分: 特征数据:自变量(楼层,采光率,面积) 目标数据:因变量(售价) 模型的分类: 有监督学习:如果模型需要的样本数据中必须包含特征和目标数据,则该模型归为有监督学习的分类 无监督学习:如果模型需要的样本数据只需要有特征数据即可。 sklearn模块:大概封装了10多种算法模型对象。 线性回归算法模型-》预测 KNN算法模型-》分类 问题:验证码识别算是预测呢还是分类呢?
导入sklearn,建立线性回归算法模型对象
from sklearn.linear_model import LinearRegression linner = LinearRegression() #样本数据的封装/提取 feature = np.array(city_dist) feature = feature.reshape(-1, 1) target = np.array(max_temp) #对模型进行训练 linner.fit(feature,target) #X:二维形式的特征数据,y:目标数据 #实现预测:对方程进行唯一值的求解 linner.predict(255) #y = 3x + 5 linner.score(feature,target) #研究score的实现原理 print('模型预测的温度:',linner.predict(feature)) print('真实温度:',target) #回归的曲线画出 x = np.linspace(0,350,100).reshape(-1,1) y = linner.predict(x) plt.scatter(city_dist,max_temp) plt.scatter(x,y) plt.xlabel('距离') plt.ylabel('温度') plt.title('海滨城市最高温度和离还远近之间的关系')
二、在scikit-learn库中使用k-近邻算法
#from sklearn.neighbors import KNeighborsClassifier import pandas as pd import numpy as np df = pd.read_excel('../../my_films.xlsx') from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=3) feature = df[['Action lens','Love lens']] target = df['target'] knn.fit(feature,target) movie = np.array([[13,21]]) #求解 knn.predict(movie) #可靠度 knn.score(feature,target)
三、在KNN中手写数字识别
导入库及大数据源
import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifier #读取大数据照片 img_arr = plt.imread('./data/3/3_2.bmp') img_arr.shape plt.imshow(img_arr) img_arr.shape#查看(28,28)
样本数据的提取
-
- 特征:每一张图片对应的numpy数组
- 目标:0,1,2,3,4,5,6,7,8,9
feature = [] target = [] for i in range(10):#i:0-9表示的是文件夹的名称 for j in range(1,501):#j:1-500表示的是图片的名称的一部分 imgPath = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp' img_arr = plt.imread(imgPath) feature.append(img_arr) target.append(i) feature = np.array(feature) #feature是一个三维的数组 target = np.array(target) feature.shape feature = feature.reshape(5000,784) feature.shape
进行样本数据的打乱
np.random.seed(10) np.random.shuffle(feature) np.random.seed(10) np.random.shuffle(target) #控制随机值指标一致
交叉验证(训练集Train、测试集Test)
#训练数据是以train结尾的 x_train = feature[:4950] y_train = target[:4950] #测试数据是以test结尾的 x_test = feature[4950:] y_test = target[4950:] knn = KNeighborsClassifier(n_neighbors=9) 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 eight_arr = img_arr[175:240,85:135] plt.imshow(eight_arr) eight_arr.shape #将8对应的图片进行降维(65, 50, 3)降低成(784,) eight_arr = eight_arr.mean(axis=2) #进行图片像素的等比例压缩 import scipy.ndimage as ndimage eight_arr = ndimage.zoom(eight_arr,zoom=(28/65,28/50)) #进行图片格式对应 eight_arr = eight_arr.reshape(1,784) 求解 knn.predict(eight_arr)
补充:K-近邻算法(KNN)
1、k-近邻算法原理
-
- 优点:精度高(计算距离)、对异常值不敏感(单纯根据距离进行分类,会忽略特殊情况)、无数据输入假定(不会对数据预先进行判定)。
- 缺点:时间复杂度高、空间复杂度高。
- 适用数据范围:数值型和标称型。
工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。