机器学习
文章平均质量分 68
机器学习基础知识
vincent_hahaha
haha ha
展开
-
sklearn下的ROC与AUC原理详解
ROC全称Receiver operating characteristic。定义TPR:true positive rate,正样本中分类正确的比率,即TP/(TP+FN),一般希望它越大越好FPR:false negtive rage,负样本中分类错误的比率,即FP/(FP+TN),一般希望它越小越好ROC曲线:以FPR作为X轴,TPR作为y轴roc_curve函数的原理及计算方式要作ROC曲线,需要计算FPR及对应的TPR。对于一个给定的预测概率,设定不同的阈值,预测结果会不一样。例如我转载 2021-12-10 09:53:38 · 2208 阅读 · 0 评论 -
sklearn.metrics中的roc_auc_score理解以及使用
import numpy as npfrom sklearn import metricsimport matplotlib.pyplot as pltlabel=np.array([1,1,-1,-1])scores=np.array([0.7,0.2,0.4,0.5])fpr,tpr,thresholds=metrics.roc_curve(label,scores)print('FPR:',fpr)print('TPR:',tpr)print('thresholds:',thresho原创 2021-11-18 16:30:14 · 1653 阅读 · 0 评论 -
利用pickle保存模型
当我们训练完成一个模型后,我们需要将模型保存起来,以便下次方便使用。picklepickle是python自带的保存模型的方法。保存模型:from sklearn import svmfrom sklearn import datasetsimport pickleclf = svm.SVC() # 创建一个SVC模型iris = datasets.load_iris()X, y = iris.data, iris.targetclf.fit(X, y) # 训练模型# 保存模型原创 2021-11-11 21:49:29 · 3536 阅读 · 0 评论 -
sklearn 学习曲线Learning Curve和 validation_curve
学习曲线是什么?简单来说,就是用学习曲线(learning curve)来判断模型状态:过拟合还是欠拟合。学习曲线是根据不同训练集大小,模型在训练集和验证集上的得分变化曲线。也就是以样本数为横坐标,训练和交叉验证集上的得分(如准确率)为纵坐标。learning curve可以帮助我们判断模型现在所处的状态:过拟合(overfiting / high variance) or 欠拟合(underfitting / high bias,模型欠拟合、过拟合、偏差和方差平衡 时对应的学习曲线如下图所示:(1原创 2021-11-11 17:04:48 · 5260 阅读 · 0 评论 -
利用sklearn 交叉验证训练参数
from sklearn.model_selection import cross_val_scoreimport matplotlib.pyplot as pltk_range = range(1, 31)k_scores = []for k in k_range: knn = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn, iris_X, iris_y, cv = 10, scoring = 'a原创 2021-11-11 16:12:46 · 1147 阅读 · 0 评论 -
sklearn LinearRegression
from sklearn import datasetsfrom sklearn.linear_model import LinearRegressionimport matplotlib.pyplot as pltloaded_data = datasets.load_boston()data_X = loaded_data.datadata_y = loaded_data.targetmodel = LinearRegression()model.fit(data_X, data_y)原创 2021-11-11 13:47:57 · 2431 阅读 · 0 评论 -
混淆矩阵、精确率、召回率、F1值、ROC曲线、AUC曲线
假设一个分类器A,分类器A的作用是告诉你一张图片是不是汉堡,我们如果想知道这个分类器的效果到底好不好,如何做?最简单的方法就是将手机里所有的图片都扔给分类器A看,让分类器告诉我们哪些是汉堡我们无法直观的看到这个分类器的效果怎么样,有没有一种更好地办法来直观而又不损失信息的表示它的实验结果。一张图片的真实类别有两种情况(是汉堡,不是汉堡),分类器的预测类别也可以告诉我们两种情况(是汉堡,不是汉堡)。所以得到下面这张图,这张图就是混淆矩阵(Confusion Matrix):根据混淆矩阵,我们看到薄原创 2021-10-29 00:22:00 · 4339 阅读 · 1 评论 -
Pytorch笔记:维度dim的定义及其理解使用
import numpy as np# 随机生成维度2*3*4的矩阵a = np.random.randint(1, 100, [2, 3, 4])a=array([[[11, 6, 15, 41], [71, 8, 22, 44], [58, 30, 60, 27]], [[34, 66, 14, 41], [42, 37, 85, 20], [72, 21, 2, 41]]])a.max(0)=array原创 2021-09-02 17:46:06 · 1571 阅读 · 0 评论 -
Pytorch详解NLLLoss和CrossEntropyLoss、以及softmax和log_softmax
数据import torchimport torch.nn.functional as Fimport numpy as np# 随机新建3个样例数据,每个样例数据包含4个属性特征input = torch.randn(3,4)tensor([[ 0.0054, -0.8030, -0.5758, -0.6518], [-0.5518, 0.3904, 0.5296, 0.4973], [ 0.1608, 0.5822, 0.9536, -0.3173原创 2021-09-02 15:00:38 · 2485 阅读 · 3 评论 -
【转】奇异值分解
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总结,并讨论在在PCA降维算法中是如何运用运用SVD的。1. 回顾特征值和特征向量首先回顾下特征值和特征向量的定义如下:Ax=λxAx = \lambda xAx=λx其中AAA是一个n×nn \times nn×n矩阵,xxx是一个nnn维向量,则原创 2021-09-01 17:22:32 · 370 阅读 · 0 评论 -
dropout理解(三)
本节使用的pytorch版本为1.8.1,其中的torch.nn.functional函数中的dropout方法中的参数training默认为True:下面进入正文,首先创建一个简单的模型:import torchimport torch.nn as nnimport torch.nn.functional as Fclass LinearFC(nn.Module): def __init__(self): super(LinearFC, self).__init_原创 2021-08-27 14:45:31 · 569 阅读 · 0 评论 -
概率与似然
概率表达了在给定参数条件θ\thetaθ下,样本X=xX=xX=x的可能性是多大。而似然表示的是在给定样本X=xX=xX=x时,参数θ\thetaθ的可能性。例如在离散情况下:L(θ1∣x)=Pθ1(X=x)>Pθ2(X=x)=L(θ2∣x)L(\theta_1|x)=P_{\theta_1}(X=x) > P_{\theta _2}(X=x) = L(\theta_2|x)L(θ1∣x)=Pθ1(X=x)>Pθ2(X=x)=L(θ2∣x)如果上式成立,则在参数θ1原创 2021-07-07 22:13:06 · 131 阅读 · 0 评论 -
SVD矩阵分解
为什么要对矩阵进行分解原始的矩阵表示数据最完整的信息,分解完之后,信息不就不完整了吗?为什么要做矩阵分解?假如有一批电商数据,有一些用户购买了一些商品,假设100万用户,10万个商品。用矩阵表示则有100万*10万的维度 ,这是一个很大的矩阵,同时也是一个稀疏的矩阵,因为每个用户不能买所有的商品。这么庞大的矩阵中,我们也无法提取出重点信息。因此将这个大矩阵分解成多个小矩阵相乘。基变换基是正交的(即内积为0,或者直观说相互垂直),并且基是线性无关的。假设如果y轴和x轴不是正交的,也就是不是垂直,夹角原创 2021-07-06 23:43:14 · 342 阅读 · 0 评论 -
特征值和特征向量到底描述了什么
矩阵的乘法矩阵对向量可以做拉伸也可以做旋转对角矩阵对向量(x,y)(x,y)(x,y)在x轴上拉伸了3倍。非对角矩阵对向量(x,y)(x,y)(x,y)不仅做了拉伸,同时也做了旋转。特征值和特征向量到底描述了什么举个例子:打拳击。我们可以把方向当做特征向量,在这个方向上用多大的力量就是特征值。特征向量可以说是主要的前进目标,特征值是向这个目标产生多大的作用。数学定义对于给定矩阵A,寻找一个常数λ\lambdaλ和非零向量xxx,使得向量xxx被矩阵A作用后所得的向量AxAxAx与原向量xxx原创 2021-07-06 22:27:25 · 657 阅读 · 0 评论 -
矩阵的秩到底描述了什么?
秩「秩」是图像经过矩阵变换之后的空间维度。假设原始向量A(x,y)是一个点,如果与矩阵[cos(θ)−sin(θ)sin(θ)cos(θ)]\begin{bmatrix}cos(\theta) & -sin(\theta) \\sin(\theta) & cos(\theta) \end{bmatrix}[cos(θ)sin(θ)−sin(θ)cos(θ)]相乘之后得到,A(xCos(θ)+ySin(θ),−xSin(θ)+yCos(θ))A(xCos(\theta原创 2021-07-06 21:54:32 · 790 阅读 · 0 评论 -
PCA降维代码实现
背景主成分分析(Principal Components Analysis),简称PCA,是一种数据降维技术,用于数据预处理。一般我们获取的原始数据维度都很高,比如1000个特征,在这1000个特征中可能包含了很多无用的信息或者噪声,真正有用的特征才100个,那么我们可以运用PCA算法将1000个特征降到100个特征。这样不仅可以去除无用的噪声,还能减少很大的计算量。在PCA中,数据从原来的坐标系转化到新的坐标系中。当然这里新的坐标系也不是随便设定的,而是应该根据数据本身的特征来设计。通常第一个新坐标轴转载 2021-06-29 23:45:15 · 1378 阅读 · 0 评论 -
利用贝叶斯分析唐诗的作者是李白还是杜甫
import jiebafrom nltk.classify import NaiveBayesClassifier# 需要提前把李白的诗收集一下,放在libai.txt文本中。text1 = open(r"libai.txt", "rb").read()list1 = jieba.cut(text1)result1 = " ".join(list1)# 需要提前把杜甫的诗收集一下,放在dufu.txt文本中。text2 = open(r"dufu.txt", "rb").read()li原创 2021-06-17 14:11:36 · 331 阅读 · 2 评论 -
向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
向量是由n个实数组成的一个n行1列(n1)或一个1行n列(1n)的有序数组;向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。点乘公式对于向量a和向量b:a和b的点积公式为:要求一维向量a和向量b的行列数相同。点乘几何意义点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影,有公式:推导过程如下,首先看一下向量组成:定义向量:根据三角形余弦定理有:根据关系c=a-原创 2021-06-16 22:28:48 · 3174 阅读 · 0 评论 -
【转】python-word2vec模块使用详解
安装安装方法:pip install --upgrade gensim安装分词:pip install jieba中文训练预料处理首先去网上下载一本小书,然后将其另存为utf-8格式文本文件准备好,现在开始用python对此txt文档进行处理。from gensim.models import word2vecimport osimport gensimfrom word2vec import model_trainimport jieba# 此函数作用是对初始语料进行分词处理后原创 2021-06-16 22:11:30 · 1677 阅读 · 0 评论 -
word2vec介绍
word2vec是一种将word转为向量的方法,其包含两种算法,分别是skip-gram和CBOW,它们的最大区别是skip-gram是通过中心词去预测中心词周围的词,而CBOW是通过周围的词去预测中心词。这个word2vec的方法是在2013年的论文《Efficient Estimation of Word Representations inVector Space》中提出的,作者来自google,文章下载链接:https://arxiv.org/pdf/1301.3781.pdf文章提出了这两种方原创 2021-06-16 21:54:22 · 36199 阅读 · 26 评论 -
Batch Norm常用方法
在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature scaling),比如:在随机梯度下降(stochastic gradient descent)算法中,特征缩放有时能提高算法的收敛速度。特征缩放的目标就是数据规范化,使得特征的范围具有可比性。它是数据处理的预处理,对后面的使用数据具有关键作用。机器算法为什么要特征缩放?特征缩放还可以使机器学习算法工作的更好。比如在K近邻算法中,分类器主要是计算两点之间的欧几里得距离,如果一个特征比其它的特征有更大的范围值,那么距离将会被这原创 2021-05-20 14:35:11 · 524 阅读 · 0 评论 -
逻辑回归与线性回归
1. 线性回归1.1概念对于一组特征,使用线性方程来进行拟合,对结果进行预测,公式如下:hθ(X)=θTX=θ0X0+θ1X1+⋅⋅⋅+θnXnθ=(θ0,θ1,θ2,...,θn)X=(X0,X1,X2,...,Xn)其中X1=1h_\theta (X)= \theta^TX = \theta_0X_0+\theta_1X_1+···+\theta_nX_n \\\theta=(\theta_0,\theta_1,\theta_2,...,\theta_n) \\X=(X_0,X_1,X_2,原创 2021-05-11 10:48:19 · 181 阅读 · 0 评论 -
PCA降维原理
PCA最重要的降维方法之一,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用,一般我们提到降维最容易想到的算法就是PCA,目标是基于方差提取最有价值的信息,属于无监督问题。方差方差描述的是样本集合的各个样本点到均值的距离之平均,一般用来描述一维数据的离散程度的度量,在概率论和统计方差用来度量随机变量和数据期望之间的偏离程度。Var(a)=1m∑i=1m(ai−μ)2 Var(a) = \frac{1}{m}\sum_{i=1}^m(a_i-\mu)^2Var(a)=m1i=1∑m(ai−原创 2021-04-30 13:23:36 · 601 阅读 · 0 评论 -
RuntimeError: CUDA out of memory. Tried to allocate 98.00 MiB (GPU 0; 31.75 GiB total capacity;
在运行pytorch程序时,出现GPU内存溢出,使用nvidia-smi查看显卡只用了一个:因此,可以切换到其他显卡上:在程序最上方添加:import osos.environ["CUDA_VISIBLE_DEVICES"] = '1'import torchfrom torch import optim, nnimport visdomimport torchvisionfrom torch.utils.data import DataLoaderfrom pokemon imp原创 2021-04-08 15:35:00 · 2146 阅读 · 0 评论 -
PyTorch教程(十二):链式法则
通过使用链式法则就可以把最后一层的误差一层一层的输出到中间层的权值中去,从而得到中间层的梯度信息,然后就可以很好的更新权值,得到最优化的效果。链式法则公式:∂y∂x=∂y∂u∂u∂x\frac {\partial y}{\partial x} = \frac {\partial y }{\partial u} \frac {\partial u}{\partial x} ∂x∂y=∂u∂y∂x∂u对于一个简单的线性层来说不需要链式法则,但是对于对于实际的神经网络来说,展开公式是非常复杂的,不原创 2021-02-23 15:34:49 · 556 阅读 · 0 评论 -
PyTorch教程(十一):多输出的感知机以及梯度
上一节中介绍了单层感知机,感知机的输出节点只有一个,只有O0O_0O0没有O1O_1O1。对于单层感知机的梯度下降公式如下:∂E∂wj0=(O0−t)∗O0(1−O0)xj0\frac {\partial E}{\partial w_{j0}} = (O_0 -t)*O_0(1-O_0)x_j^0∂wj0∂E=(O0−t)∗O0(1−O0)xj0即对参数wj0w_{j0}wj0的梯度。可以看出wj0w_{j0}wj0的梯度跟这一层的输出权值以及xj0x_{j0}xj0有关。多原创 2021-02-23 11:29:06 · 455 阅读 · 0 评论 -
PyTorch教程(十):单层感知机以及梯度更新
单层感知机模型y=XW+by=∑xi∗wi+by = XW + b \\y = \sum x_i*w_i+ by=XW+by=∑xi∗wi+b单层感知机模型的每一个输入节点xix_ixi和对应的权重wiw_iwi相乘累加后,与bias相加,便得到了预测值。我们使用sigmoid函数作为激活函数,通常使用符号σ\sigmaσ表示。对于最左边的输入层的上标,也就是xn0x_n^0xn0中的0表示第0层,n表示第0层第n个元素节点。从www到σ\sigmaσ是1层,wij1w^1_{i原创 2021-02-22 17:14:52 · 1412 阅读 · 0 评论 -
PyTorch教程(九):损失函数与Loss的梯度
均方差Mean Squared Error(MSE)MSE基本形式:loss=∑[y−(xw+b)]2loss = \sum[y-(xw+b)]^2loss=∑[y−(xw+b)]2这里的模型使用非常简单的线性感知机,如果使用其他的网络,则修改为loss=∑[y−f(x;w,b)]2loss = \sum[y-f(x;w,b)]^2loss=∑[y−f(x;w,b)]2需要注意的是,这里的均方差MSE和L2-norm是有区别的:l2−norm=∑(y1−y2)2l2-norm=\sqrt{\原创 2021-02-22 15:43:06 · 7878 阅读 · 3 评论 -
PyTorch教程(八):常见激活函数与Loss的梯度
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。上图就是一个最简单的激活函数,当∑i=0N>0\sum_{i=0}^N>0∑i=0N>0时节点才会激活。但是这个激活函数有一个问题是不可导,在∑i=0N=0\sum_{i=0}^N=0∑i=0N=0处是处于不连续的情况下,因原创 2021-02-22 12:52:16 · 441 阅读 · 0 评论 -
PyTorch教程(七):属性统计
范数1-范数:∥x∥1=∑i=1N∣xi∣\left \| x \right \|_1=\sum_{i=1}^N\left| x_i \right|∥x∥1=∑i=1N∣xi∣ 即向量元素绝对值之和。import torcha = torch.full([8],1)b = a.view(2,4)# tensor([[1, 1, 1, 1],# [1, 1, 1, 1]])c = a.view(2,2,2)# tensor([[[1, 1],# [1, 1原创 2021-02-20 16:00:29 · 451 阅读 · 0 评论 -
PyTorch教程(六):算数运算
import torcha = torch.rand(3,4)# tensor([[0.0422, 0.9152, 0.5486, 0.8753],# [0.3918, 0.6056, 0.0634, 0.9498],# [0.4444, 0.2209, 0.8165, 0.1533]])b = torch.rand(4)# tensor([0.4145, 0.2913, 0.1655, 0.3705])a + b# tensor([[0.4567, 1.2原创 2021-02-19 23:14:07 · 1210 阅读 · 0 评论 -
PyTorch教程(五):Broadcasting
Broadcasting可以自动进行维度的扩展,而且不需要拷贝数据。例如:import torcha = torch.rand(3,4)# tensor([[0.0422, 0.9152, 0.5486, 0.8753],# [0.3918, 0.6056, 0.0634, 0.9498],# [0.4444, 0.2209, 0.8165, 0.1533]])b = torch.rand(4)# tensor([0.4145, 0.2913, 0.1655,原创 2021-02-19 22:14:32 · 417 阅读 · 0 评论 -
PyTorch教程(四):维度变换
view和reshape在PyTorch0.3版本中使用view,在PyTorch0.4以后增加了reshape,作用是将一个shape转变为另一个shape。shape变化的前提是保证numel()一致a = torch.rand(4,1,28,28) # 4张图片,灰度,28长,28宽# torch.Size([4, 1, 28, 28])a.view(4, 1*28*28) a.view(4, 1*28*28).shape # torch.Size([4, 784]) # 这里丢失了原原创 2021-02-18 20:46:57 · 1208 阅读 · 0 评论 -
PyTorch教程(三):索引与切片
a = torch.rand(4,3,28,28) # 4张图片,3通道,高度28,宽度28 a[0].shape # torch.Size([3, 28, 28]) 表示第0张图片的shape是3通道,高度28,宽度28 a[0,0].shape # torch.Size([28, 28]) 表示第0张图片第0个通道的shape a[0,0,2,4].shape # tensor(0.5649) 表示第0张图片第0个通道第2行第4列的值是0.5649a[:2].shape # torch.Si.原创 2021-02-18 19:39:43 · 328 阅读 · 0 评论 -
PyTorch教程(二):创建Tensor
从numpy中引入数据a = numpy.array([2,3.3])torch.from_numpy(a) # tensor([2.0000, 3.3000], dtype=torch.float64)a = numpy.ones([2,3])torch.from_numpy(a)# tensor([[1., 1., 1.],# [1., 1., 1.]], dtype=torch.float64)从list中引入数据torch.tensor([2, 3.2]) # te原创 2021-02-18 16:46:40 · 876 阅读 · 0 评论 -
PyTorch教程(一):张量数据类型
pythonPyTorchintIntTensor of size()floatFloatTensor of size()Int arrayIntTensor of size[d1,d2,…]Float arrayFloatTensor of size [d1,d2,…]string–需要注意的是,python中的string,在PyTorch中没有对应的数据类型,一般使用One-hot可以进行表示,也就是[0,1,0,0,0]的方式表示一个字符...原创 2021-02-18 14:13:01 · 697 阅读 · 0 评论 -
机器学习(四) 下采样和上采样
查看数据样本import pandas as pdimport matplotlib.pyplot as pltimport numpy as np%matplotlib inlinedata = pd.read_csv("./data/creditcard.csv")data.head()这个数据,并不是最原始数据,而是通过降维操作把数据进行特征压缩。我们可以根据这些特征进行建模。这些数据有一列class,用来标注是否正常,0表示正常,1表示异常。这是经典的二分类问题。首先查看原创 2021-02-05 17:13:16 · 7316 阅读 · 0 评论 -
机器学习(三)逻辑回归以及python简单实现
虽然有回归两个字,但是依然是解决的时分类问题,是最经典的二分类算法。分类算法有很多,例如支持向量机和神经网络。而逻辑回归算法应用的比较广,往往是优先选择的算法。Sigmod函数表达式:g(z)=11+e−zg(z)=\frac{1}{1+e^{-z}}g(z)=1+e−z1自变量取值为任意实数,值域[0,1]在线性回归中的结果预测出一个值,将这个值放到这个sigmod中,得到一个输出结果,而这个结果可以表示为概率值。假设预测函数: hθ(x)=g(θTx)=11+e−θTxh_\the原创 2021-01-29 15:08:45 · 321 阅读 · 0 评论 -
机器学习(二)梯度下降
在上一节(线性回归)中介绍,在线性回归中参数值θ\thetaθ是不一定可以求出的,但是可以通过梯度下降的方式可求。在微积分里面,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y)f(x,y)f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f∂x,∂f∂y)T(\frac {\partial f}{\partial x},\frac {\partial f}{\partial y})^T(∂x∂f,∂y∂f)T,简称grad f(x,y)或者原创 2021-01-26 17:08:18 · 131 阅读 · 0 评论 -
机器学习(一)线性回归
1. 举个例子数据:工资和年龄(2个特征)目标:预测银行可以给我贷款多少钱(标签)考虑:工资和年龄都会影响银行贷款的结果,那么它们各自的影响有多大呢?(参数)1.1数据工资年龄贷款额度40002520000800030700005000283500075003350000120004085000这份数据有两个特征x1:工资和x2:年龄,最终要预测一个具体的值y,这就需要回归模型,而非分类算法。目的是如何找到这个曲面函数。原创 2021-01-26 13:58:31 · 139 阅读 · 0 评论