赞
踩
机器学习:利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 x i x_i xi来表示一个样本,其中 i = 1 , 2 , 3 , . . . , N i=1,2,3,...,N i=1,2,3,...,N,共N个样本,每个样本 x i = ( x i 1 , x i 2 , . . . , x i p , y i ) x_i=(x_{i1},x_{i2},...,x_{ip},y_i) xi=(xi1,xi2,...,xip,yi)共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度 y i y_i yi我们称为因变量(响应变量)。
特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本 x i x_i xi,一列表示一个特征。
根据数据是否有因变量,机器学习的任务可分为:
(如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。)
(如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。)
总结:
有监督:有因变量、有特征向量、预测结果
无监督:没有因变量、有特征向量、寻找数据结构/规律
根据因变量的是否连续,有监督学习又分为:
为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
第i个样本:
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
p
,
y
i
)
T
,
i
=
1
,
2
,
.
.
.
,
N
x_i=(x_{i1},x_{i2},...,x_{ip},y_i)^T,i=1,2,...,N
xi=(xi1,xi2,...,xip,yi)T,i=1,2,...,N
因变量
y
=
(
y
1
,
y
2
,
.
.
.
,
y
N
)
T
y=(y_1,y_2,...,y_N)^T
y=(y1,y2,...,yN)T
第k个特征:
x
(
k
)
=
(
x
1
k
,
x
2
k
,
.
.
.
,
x
N
k
)
T
x^{(k)}=(x_{1k},x_{2k},...,x_{Nk})^T
x(k)=(x1k,x2k,...,xNk)T
特征矩阵
X
=
(
x
1
,
x
2
,
.
.
.
,
x
N
)
T
X=(x_1,x_2,...,x_N)^T
X=(x1,x2,...,xN)T
了解了理论知识,再来看看如何在python里使用机器学习(scikit-learn)工具库,简称sklearn。sklearn中所有内置数据集都封装在datasets对象内。
** datasets,有很多可用来学习算法模型的数据库。 **
主要有两种:
封装好的经典数据。eg: boston 房价, 糖尿病, 数字, Iris 花。在代码中以“load”开头。
自己设计参数,然后生成的数据,例如用来训练线性回归模型的数据(强大)。在代码中以“make”开头
返回的对象有:
首先,我们先来看看有监督学习中回归的例子,我们使用sklearn内置数据集Boston房价数据集。
# 引入相关科学计算包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt # matplotlib作图工具
# %matplotlib inline # 直接在你的cell里生成图像
plt.style.use("ggplot") # 使用自带的样式进行美化
import seaborn as sns # 基于matplotlib的图形可视化python包,提供了一种高度交互式界面
# 导入 sklearn 中的datasets对象
from sklearn import datasets
boston = datasets.load_boston() # 导入内置数据集Boston房价,返回一个类似于字典的类
X = boston.data # 特征X的矩阵
y = boston.target # 因变量的向量
features = boston.feature_names # 特征名称
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | Price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 | 34.7 |
3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 | 36.2 |
各个特征的相关解释:
%%time
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6) # alpha,图片的透明度
plt.title("Price~NOX") # 标题
plt.show()
# 这里会有关于futureWarning提示,如何解决呢?添加以下两行代码即可
from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning)
Wall time: 134 ms
%%time
plt.figure() #新建子图
plt.scatter(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title('Dataset')
plt.show()
Wall time: 135 ms
从上面两种情况来看,plt 和sns 画图,目前除了颜色上,散点大小上有区别外,还包括横纵坐标轴的美化,sns直接就会体现,而plt没有,需要再添代码设置。两者图出来的时间差不多,想要查看,可用%%time语句来验证。
** 另一种查看程序运行时间代码:**
“”"
from time import time
start = time()
“”“运行的代码块”""
end = time()
print(‘running time is :%s seconds’%(end - start))"""
我们可以看到,数据给定任务所需要的因变量,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。
著名的iris鸢尾花数据集作为机器学习的分类鼻祖,必须有被cue到。
# 仍旧是sklearn的内置数据集datasets
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
iris_data = pd.DataFrame(X,columns=features)
iris_data['target'] = y
iris_data.head()
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | target | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
各个特征的相关解释:
# 可视化特征
# Matplotlib 设置参数marker的值
marker = ['s','x','o'] # 正方形、x、圆
# np.unique():去除数组中的重复数字,并进行排序之后输出
for index,c in enumerate(np.unique(y)): # 对y值去重,并枚举
plt.scatter(x=iris_data.loc[y==c,"sepal length (cm)"],y=iris_data.loc[y==c,"sepal width (cm)"],alpha=0.8,label=c,marker=marker[c])
# label,图例的名称,marker,形状
plt.xlabel("sepal length (cm)") # 设置横坐标名称
plt.ylabel("sepal width (cm)") # 设置纵坐标名称
plt.legend() # 给图加上图例(0、1、2)
plt.show()
增加一个maker知识点:
marker | type | 含义 | |
---|---|---|---|
0 | “.” | point | 点 |
1 | “,” | pixel | 像素 |
2 | “o” | circle | 圆 |
3 | “v” | triangle_down | 下三角 |
4 | “^” | triangle_up | 上三角 |
5 | “<” | triangle_left | 左三角 |
6 | “>” | triangle_right | 右三角 |
7 | “1” | tri_down | 类似奔驰的标志 |
8 | “2” | tri_up | 类似奔驰的标志 |
9 | “3” | tri_left | 类似奔驰的标志 |
10 | “4” | tri_right | 类似奔驰的标志 |
11 | “8” | octagon | 八角形 |
12 | “s” | square | 正方形 |
13 | “p” | pentagon | 五角星 |
14 | “*” | star | 星号 |
15 | “h” | hexagon1 | 六边形1 |
16 | “H” | hexagon2 | 六边形2 |
17 | “+” | plus | 加号 |
18 | “x” | x | x |
19 | “D” | diamond | 钻石 |
20 | “d” | thin_diamond | 细的钻石 |
21 | “ | “ | vline |
22 | “-“ | hline | 水平方向的线 |
23 | “TICKLEFT” | octagon | 像素 |
我们可以看到:每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花。因此因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets
# 生成月牙型非凸集
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.05, random_state=None)
# 噪声
# shuffle,分割之前是否对数据进行洗牌(默认True)
# random_state:随机种子 当种子固定时,可以实现实验复现,每次可以分割得到同样训练集和测试集,方便调节参数
# 只有当shuffle=True时,random_state才起作用
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c,0],x[y==c,1],s=7)
plt.show()
# 生成符合正态分布的聚类数据
from sklearn import datasets
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。