【数据分析day07】机器学习入门 & KNN(分类,回归)

机器学习入门

原理

在这里插入图片描述

  • 定义:机器指的就是电脑。
  • 把“人工智能”问题转换成“计算”问题(电脑善于计算),深度学习有3个方向:“语音识别”,“图像识别”,“自然语义识别”
  • 人工智能时代的真正到来,是量子计算机的商用化
  • 我们目前学习的是“数据挖掘”
  • 实际做的就是“导包” :from sklearn import svm

机器学习分类

1. 有监督学习(知道结果)

分类 (有限数据)

- 分类计数预测的数据对象是**离散的**。(预测分类)如短信是否为垃圾短信,用户是否喜欢电子产品
- K近邻、朴素贝叶斯、决策树、SVM

回归 (无限数据)

- 回归技术预测的数据对象是**连续值**。(预测趋势)例如温度变化或时间变化。包括一元回归和多元回归,线性回归和非线性回归
- 线性回归、逻辑回归、岭回归

2. 无监督学习

聚类

- 聚类算法用于在数据中寻找隐藏的模式或分组。
- K-means

3. 半监督学习(不用管)

深度学习

深度学习有3个方向:“语音识别”,“图像识别”,“自然语义识别”

KNN 基础知识

k-近邻算法原理

  • k-Nearest Neighbor,KNN

  • K-近邻算法采用测量不同特征值之间的距离方法进行分类

  • 欧几里得距离(多维空间距离)公式:
    在这里插入图片描述

  • 判断一个点属于哪个分类,先分别计算出该点和所有已知点的距离,再进行排序,最后取出最小的K个来进行分类判断 (K默认为5个)

适用数据范围:

  • 数值型: 只在有限目标集中取值,一般用作“分类”
  • 标称型: 可以从无限的数值集合中取值,主要用作“回归”

优缺点&改进

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:时间复杂度高、空间复杂度高。
  • 改进:因为很消耗支援,一般不做商用,但可进行优化:
    1. 解决计算量大的问题:限定范围半径进行剪辑(即取周围有效半径的点算距离)
    2. 解决样本不平衡问题:加权重

KNN 用法之:分类

导包:KNeighborsClassifier

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.neighbors import KNeighborsClassifier

例子一:电影分类

数据

movie = pd.read_excel('../tests.xlsx', sheet_name=1)
movie

在这里插入图片描述
解决中文问题

plt.rcParams['font.sans-serif'] = ['SimHei']

以接吻镜头作为y轴, 武打镜头作为x轴画散点图, 0表示动作片, 1表示爱情片

plt.scatter(x=movie.武打镜头.values, y=movie.接吻镜头.values, c=[0,0,1,0,1,1,])
plt.ylabel('接吻镜头')
plt.xlabel('武打镜头')

在这里插入图片描述
机器学习算法的样本必须是二维

knn = KNeighborsClassifier()

X_train = movie[['接吻镜头', '武打镜头']]
y_train = movie['分类情况']
knn.fit(X_train , y_train)

在这里插入图片描述
机器训练完成后,创建一些已知结果的常识数据:X_test (测试数据) & y_test (测试结果)

# 大约在冬季 黑客帝国  叶问, 终结者, 一生有你2019
X_test = np.array([[10, 0], [2, 60], [0, 35], [1, 40],[20, 0])
y_test = np.array(['爱情片', '动作片', '动作片', '动作片', '爱情片'])

把测试数据放到机器学习后的函数中去,生成预测结果 “y_”

y_ = knn.predict(X_test)
y_

在这里插入图片描述
观察可发现预测结果 y_ 和 测试结果 y_test 完全一样
查看一下“测试数据”和“测试结果”的分数

knn.score(X_test, y_test)

在这里插入图片描述

将测试数据和测试结果画成散点图,对比之前的散点图分布

plt.scatter(x=movie.武打镜头.values, y=movie.接吻镜头.values, c=[0,0,1,0,1,1,])
plt.ylabel('接吻镜头')
plt.xlabel('武打镜头')
plt.scatter(X_test[:,1], X_test[:,0])

蓝色的点就是后面测试数据产生的点的分类。两个点距靠近“接吻镜头”,3个点靠近“武打镜头”
在这里插入图片描述

例子二:性别分类

  • 根据身高、体重、鞋子尺码数据对性别分类判断

“训练数据”和“训练结果”

X_train = np.array([[180, 180, 43], [150, 120, 35], [160, 130, 40], [165, 110, 38], [170, 120, 42], [175, 150, 43], [160, 100, 38], [190, 200, 45], [170, 120, 40], [177, 130, 43]])
y_train = np.array(['男', '女', '男', '女', '男', '男', '女', '男', '女', '男'])

机器学习

knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

在这里插入图片描述
创建(已知结果的的)“测试数据”和“测试结果”

X_test = np.array([[166, 120, 38], [185, 150, 44], [155, 90, 36], [172, 130, 41], [168, 120, 39]])
y_test = np.array(['女', '男', '女', '男', '女'])

预测

y_ = knn.predict(X_test)
y_ 

在这里插入图片描述
查看测试数据和测试结果的打分

knn.score(X_test, y_test)

在这里插入图片描述
查看训练数据和训练结果的打分

knn.score(X_train, y_train)

在这里插入图片描述

例子三:(yuan)鸢尾花分类

  • 加利福尼亚大学数据集:http://archive.ics.uci.edu/ml/index.php
    在这里插入图片描述

已经包含在sklearn数据集中

from sklearn.datasets import load_iris

iris = load_iris()
iris

返回值是字典,包含了多种数据:
在这里插入图片描述
在这里插入图片描述
我们需要用到"data"和"target"

data = iris['data']
target = iris['target']

查看维度

data.shape

在这里插入图片描述
150行,每行4个特征

从原始数据中切出一部分数据来做预测

from sklearn.model_selection import train_test_split

随机从原始数据中取出0.2*150 条预测数据

X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=1)

这里将训练数据和测试数据分成了 8份和2份
在这里插入图片描述
机器训练

knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

在这里插入图片描述
查看预测,对比“测试结果”

knn.predict(X_test)

在这里插入图片描述
查看“测试数据”和“测试结果“得分,对比“训练数据”和“训练结果”得分
在这里插入图片描述

绘图

from pandas import DataFrame
df = DataFrame(data=data)
df.plot()

在这里插入图片描述
从原始数据中取2个维度:期中一个维度做为x轴数据,另一维度作为y轴,画散点图(这里我们取0蓝色和1橙色)

data = data[:, 0:2]
data.shape

在这里插入图片描述

plt.scatter(data[:,0], data[:,1], c=target)

在这里插入图片描述
因为花的分类是三种(花名),所以是三个颜色
在这里插入图片描述
画分类边界

1) 取数据(取平面所有点)
处理data
取x轴的最大值和最小值之间的范围,分成1000份
取y轴的最大值和最小值之间的范围,分成1000份

x,y = np.linspace(data[:,0].min(), data[:,0].max(), 1000), 		np.linspace(data[:,1].min(), data[:,1].max(), 1000)

x轴和Y轴两个线拉起来,相交的地方汇成一个点(X,Y)
在这里插入图片描述

# x,y“拉起来”交汇成点
X,Y  = np.meshgrid(x,y)

查看数据

display(X, Y)

在这里插入图片描述
X.ravel() :变成一维的X[ ]
np.c_() 的效果是:从X[ ]中一个数,从Y[ ]取一个数,形成一个二维的数据
在这里插入图片描述
XY就是平面上所有的点

XY  = np.c_[X.ravel(), Y.ravel()]

训练

knn = KNeighborsClassifier()
knn.fit(data, target)

在这里插入图片描述
预测,1000*1000,平面上有100万个点,所以会慢一点

%time y_ = knn.predict(XY)

在这里插入图片描述
用了1分25秒(这还只是2维的数据,也就是为什么KNN不能商用,太慢)
这里只能看“训练数据”和“训练结果”的得分

knn.score(data, target)

在这里插入图片描述
查看knn分类边界

import time

plt.scatter(data[:,0], data[:,1], c=target)
start = time.time()
plt.scatter(XY[:,0], XY[:,1], c=y_, cmap='rainbow')
end = time.time()
print('花费%s 秒'% ( end - start))

在这里插入图片描述
上图就是knn的边界,采用的是plt.scatter(),比较慢

下面使用一种较快的绘图方式:plt.pcolormesh()

plt.pcolormesh(X, Y,  y_.reshape(1000, 1000))

在这里插入图片描述
或者 :plt.pcolormesh(y_.reshape(1000, 1000)),因为y_已经包含了“面”的信息
在这里插入图片描述

把原始数据放上去,这里必须把 “X,Y”加上,(座标系)

plt.pcolormesh(X, Y,  y_.reshape(1000, 1000))
plt.scatter(data[:,0], data[:,1], c=target, cmap='rainbow')

在这里插入图片描述

KNN 用法之:回归

  • 回归用于对趋势的预测

解决负号“-”显示报警告问题

plt.rcParams['axes.unicode_minus'] = False

生成样本数据并绘图

X_train = np.random.random(100) * 10
y_train = np.sin(X_train)
plt.scatter(X_train, y_train)

在这里插入图片描述
因为这样的正弦数据太完美了,需要人为加点噪声

y_train[::4] += np.random.randn(25) * 0.3
plt.scatter(X_train, y_train)

在这里插入图片描述
导包

from sklearn.neighbors import KNeighborsRegressor

建模,训练()数据要二维,所以用reshape()

knn = KNeighborsRegressor()
knn.fit(X_train.reshape(-1,1), y_train)

在这里插入图片描述
查看训练数据和训练结果得分

knn.score(X_train.reshape(-1,1), y_train)

生成测试数据:0~10之间取100个点,并变成2维

X_test = np.linspace(0, 10, 100).reshape(-1,1)

预测

y_ = knn.predict(X_test)

绘图

plt.scatter(X_train, y_train)
plt.plot(X_test, y_, c='r')

在这里插入图片描述
红色的线就是预测出来的趋势

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章