机器学习(课上笔记)

第一章 机器学习概述

机器学习的基本概念

机器学习:机器学习是一种计算机程序,它可以让系统在未经人为编辑的情况下,具有经验(数据)中自动学习并自我改进的能力

ps:机器学习是人工智能的一个子分类

相关知识

监督学习和无(非)监督学习

监督学习是通过现有训练数据集(以下简称训练集)进行建模,再用模型对新的数据样本进行分类或者回归分析的机器学习算法。

无监督学习则是在没有训练集的情况下,对没有标签的数据进行分析并建立合适的模型,以便给出问题解决方案的方法。

分类和回归

分类( classification )和回归( regression )都是监督学习中的概念。分类预测样本属于哪个类别,而回归预测样本目标字段的数值。

数据集和特征

数据集( dataset )是预测系统的原材料,用于训练机器学习模型的历史数据,数据集由若干条数据组成,而每条数据又包含若干个特征( feature )。特征是描述数据集中每个样本的属性,有的时候也袯称为“字段”。

特征工程

特征工程是创建预测模型之前的过程,在这个过程中我们将对数据的特征进行分析清理和结构化。

过拟合和欠拟合

当学习器把训练样本学的“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降,这种现象称为过拟合。

欠拟合是指对训练样本的一般性质尚未学好。在训练集及测试集上的表现都不好。

第二章 机器学习工具的安装和使用

略(pandas见笔记pandas)

第?章(讲的太乱了跟着记)

K最近邻算法:

原理:

k最近邻 (k-Nearest Neighboor,kNN) 学习是一种常用的监督学习方法。其原理非常简单: 对于给定测试样本,基于指定的距离度量找出训练集中与其最近的k个样本,然后基于这k个“邻居“的信息来进行预测。通常,在分类任务中用的是“投票法”,即选择k个“邻居”中出现最多的类别标记作为预测结果,在回归任务中使用“平均法”,即取k个邻居的实值输出标记的平均值作为预测结果;还可根据距离远近进行加权投票或加权平均,距离越近的样本权重越大。

思想:

是寻找与待分类的样本在特征空间中距离最近的K个已标记样本(即K个近邻),以这些样本的标记为参考通过投票等方式,将占比例最高的类别标记赋给待标记样本.

通俗易懂注释:

就是给一个测试样本,训练完后随意选择一个点,然后会向最近的(一定距离内或一定数量内)的点进行统计,选择频率最高的类型标记给样本。

示例:

K最近邻:
#导入必要的库
from sklearn.datasets import make blobs
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
#生成一个数据集
data = make_blobs(n samples=100, centers =2,random state=9)
#将特征和标签赋值给X和y
X,y = data
#使用散点图进行可视化
plt.scatter(X[y==1,0],X[y==1,1],cmap=plt.cm.spring,edgecolor='k',marker='^')
plt.scatter(X[y==0,0], X[y==0.1],cmap=plt.cm.spring, edgecolor='k',marker='o')
#显示图像plt.show()
KNN:
#导入make_regression数据集生成器
from sklearn.datasets import make regression
#生成特征数量为1,噪音为40的数据集
X,y = make_regression(n_features=l,n _informative=l,noise=30,random_state=5)
#用散点图将数据点进行可视化
# plt.scatter(X,y, c='b',edgecolor='k')
# plt. show()
#导入用于回归分析的KNN模型
from sklearn.neighbors import KNeighborsRegressor
reg = KNeighborsRegressor()
#用KNN模型拟合数据
reg.fit(X,y)
#把预测结果用图像进行可视化
z = np.linspace(-2.5,2.5,200).reshape(-1,1)
plt.scatter(X,y, c='b', edgecolor='k')
plt.plot(z,reg.predict(z),c='r',linewidth=3)
#向图像添加标题
plt.title('KNN Regressor')
plt. show()

朴素贝叶斯:

英国学者贝叶斯1763年提出贝叶斯定理,是关在于随机事件A和B的条件概率P(A)和P(B)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性,P(BA)是在A发生的情况下B发生的可能性。

1、朴素贝叶斯算法是基于贝叶斯定理,在假设“所有特征都互相独立”的情况下,根据先验概率和修正因子对后验概率进行估计的一种算法

2、朴素贝叶斯算法的特点是: 原理简单、易于实现、分类过程中效率高、时间花费少

3、常见的朴素贝叶斯算法有3种,具体包含:

(1)伯努利朴素贝叶斯,它适合特征符合伯努利分布的数据集。

(2)高斯朴素贝叶斯,它适合特征大致符合高斯分布(或可以转换为高斯分布)的数据集,同时在样本数量较大的数据集中表现相对更好

(3)多项式朴素贝叶斯,它适合特征符合多项式分布(或可以转换为多项式分布)的数据集目小样本的数据集中表现也不差

公式:

给定某系统的若干样本X,计算该系统的参数,即:

P(θ):没有数据支持下,日发生的概率:先验概率。P(θ|x): 在数据X的支持下,日发生的概率:后验概率。P(x|θ): 给定某参数日的概率分布:似然函数。

PS:给定A和B是两个事件,若有P(AB)= P(A)P(B)则称事件A和B相互独立。 A和B独立,则P(A|B)= P(A)

代码:

#导入pandas
import pandas as pd
#读取保存好的csv文件,路径和文件名换成你自己的
data = pd.read csv( '水果.csv',encoding = 'gbk') # 水果.csv单独上传在我上传的资料中
#查看是否读取成功
data

整理:

data['大小']=data['大小'].replace({'大':1,'小':0})
data['颜色']=data['颜色'].replace({'红色':1,'青色':0))
data['形状']=data['形状'].replace({'圆形':1,'非规则':0})
data['好果']=data['好果'].replace({'是':1,'否':0))
data

核心:

#导入伯努利朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
#定义好样本特征x和分类标签y
X = data.drop(['好果'],axis = 1)
y = data['好果']
#创建一个伯努利朴素贝叶斯分类器
clf = BernoulliNB()
#由于样本数量很少,这里不拆分为训练集和验证集
#使用x和y训练分类器
clf.fit(X,y)
#验证分类器的准确率
clf.score(X,y)

模型得分:

#导入数据集生成工具
from sklearn.datasets import make_blobs
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#生成样本数量为 400,分类数为 4 的数据集
X,y = make_blobs(n_samples=400, centers=4,random state=8)
#将数据集拆分成训练集和验证集,固定随机状态为8
Xtrain,X test,y_train,y_test=train test_split(X,y,random state=8)
#使用伯努利贝叶斯拟合数据
nb = BernoulliNB()
nb.fit(X_train,y_train)
print('模型得分:{:.3f)'.format(nb.score(X_test, y_test)))

决策树、随机森林算法

决策树:

通过对样本特征进行一系列“是”或“否”的判断,进而做出决策。

熵的概念:量化不确定性的程度

数据集D中第k类样本所占的比例为pk

信息增益:

ps:信息增益最大,分的最好

原理:

Random Forest (随机森林)

用随机的方式建立一个森林。随机森林算法由很多决策树组成,每一棵决策树之间没有关联。建立完森林后当有新样本进入时,每棵决策树都会分别进行判断,然后基于投票法给出分类结果。

Random Forest(随机森林)是 Bagging扩展变体,它在以决策树为基学习器构建Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,因此可以概括 随机森林包括四个部分:1随机选择样本(放回抽样)2 随机选择特征3.构建决策树4.随机森林投票(平均)

线性回归--梯度下降法(基于搜索的优化方法)

梯度下降法

import numpy as np
import matplotlib.pyplot as plt
def f(xx):
  return xx**2-5*xx+6
def df(xx):
  return 2*xx-5x0=-6
alpha=0.1#1.2#0.01#0.1#0.5 #0.8
iter=0x list=[x0]
while True:
  g=df(x0)x=x0-alpha*g
  if abs(f(x)-f(x0))<1e-15:
    break
  x_list.append(x)
  x0=Xiter+=1
  if iter>1000:
    break
t=np.array(x_list)
plt.plot(xx,yy)
plt.plot(t,f(t),marker='+',color='r)
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
from mpl_toolkits.mplot3d import Axes3D
X,y=make_regression(n_samples=300,n_features=1noise=10.bias=3,random state=123)


def L(a,b,X,y):
  x=X.ravel0return (1.0/y.size)*np.sum((a*x+b-y)*(ax+b-y)
  
  
def La(a,b,Xy):
  x=X.ravel0return (2.0/y.size)*npsum((a*x+b-y)*x)
  
  
def Lb(a,b,Xy):
  x=Xravel0return (2.0/y.size)*np.sum(a*x+b-y)
  
  
a0 = 50
b0 = 30
alpha = 0.1
iter=0
ab_list=[lao,bol]
while True:
  la=La(a0,b0,X,y)
  lb=Lb(a0.b0,X,y)
  a=a0-alpha*la
  b=b0-alpha*lb
  if abs(L(a,b,X,y)-L(a0,b0,X,y)) < 1e-15:
    break
  ab_list.append([a,b])
  a0=a
  b0=b
  iter+=1
  if iter > 1000:
    break
A=np.linspace(-12,52,num=50)
B=np.linspace(-3032,num=50)
AA,BB=np.meshgrid(A,B)
ZZ=np.array([L(a,b,X,y) for a,b in zip(AA.ravel(),BB.ravel())]).reshape(AA.shape)
%matplotlib qt
ax3d=Axes3D(plt.fiqure0)
ax3d.plot_surface(AA,BB,ZZ,cmap='jet')
aa=np.arrav(ab list)[:0]
bb=np.arrav(ab list)[:1]
cc=[L(a,b,Xy) for (a,b) in zip(aa,bb)]
ax3d.plot3D(aa,bb,cc,color='r',marker="+")

归一化:

归一化就是把所有数据都转化成[0,1]或者[-1,1]之间的数,其目的是为了取消各维数据之间的数量级差别,避免因为输入输出数据数量级差别大而造成网络预测误差过大。

  1. 为了后面数据处理的方便,归一化可以避免一些不必要的数值问题。

  1. 为了程序运行时收敛速度更快

  1. 统一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准,这算是应用层面的需求。

  1. 避免神经元饱和。就是说当神经元的激活在接近0或者1时,在这些区域,梯度几乎为0,这样在反向传播过程中,局部梯度就会接近于0,这样非常不利于网络的训练。

  1. 保证输出数据中数值小的不被吞食

  1. PS:老师给的图,虽然到现在都有点迷瞪,还是先放上去了

岭回归算法

多元线性回归

在研究现实问题时,因变量的变化往往受几个重要因素的影响,此时就需要用两个或两个以上的影响因素作为自变量来解释因变量的变化,这就是多元回归。当多个自变量与因变量之间是线性关系时,所进行的回归分析就是多元性回归。线性回归的数学模型为:

岭回归

先记到这了以后有时间再发

猜你喜欢

转载自blog.csdn.net/hello__D/article/details/129363685