记录日常学习内容,若有误请指出!
目录
1.shape 针对tensor
shape[0]返回行数,shape[1]返回列数
shape[0]针对一维数组或者矩阵,返回其总个数
2.Softmax(Pytorch)
针对分类网络,最后一层需要进行softmax进行概率转化,最后需要选择出概率最好的点作为分类标准
pre = torch.max(F.softmax(prediction_y, dim=0), 1)[1]+1
dim=0#针对行计算
dim=1#针对列计算
一般使用交叉熵作为损失函数
loss_func=torch.nn.CrossEntropyLoss()
loss = loss_func(prediction, y.squeeze(dim=1).long())
loss.backward()
3.深度学习回归处理
在网络设置中最后一层维度设置成1
4.Sklearn
Pycharm-Settings中scikits.learn=Sklean
5.SVM实现分类、回归
数据举例:
分类情况:
采用SVC
model_svr2 = SVC(kernel='rbf',C=1,gamma='auto') # 建立支持向量机回归模型对象
model.fit(x, y.ravel()) # 现将训练集x进行训练
print(model.predict(test_x))
参数设置
【参考文献:scikit-learn代码实现SVM分类与SVR回归以及调参_CtrlZ1的博客-CSDN博客_svr调参】
sklearn.svm.SVC(C=1.0,kernel='rbf', degree=3, gamma='auto',coef0=0.0,shrinking=True,probability=False,tol=0.001,cache_size=200, class_weight=None,verbose=False,max_iter=-1,decision_function_shape=None,random_state=None)
参数:
l C:C-SVC的惩罚参数C?默认值是1.0
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
l kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 线性核函数:u’v kernel=‘linear’
1 – 多项式核函数:(gamma*u’*v + coef0)^degree kernel=‘poly’
2 – 径向基核函数:exp(-gamma|u-v|^2) kernel=‘rbf’
3 – sigmod核函数:tanh(gamma*u’*v + coef0) kernel=‘sigmod’
l degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
l gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
l coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
l probability :是否采用概率估计?.默认为False
l shrinking :是否采用shrinking heuristic方法,默认为true
l tol :停止训练的误差值大小,默认为1e-3
l cache_size :核函数cache缓存大小,默认为200
l class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
l verbose :允许冗余输出?
l max_iter :最大迭代次数。-1为无限制。
l decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
l random_state :数据洗牌时的种子值,int值
主要调节的参数有:C、kernel、degree、gamma、coef0。
回归情况:
这边测试下,这两种回归模型效果比较好,SVR是支持向量机里面的回归、而GBR是梯度增强回归。
model_svr = SVR() # 建立支持向量机回归模型对象
model_gbr = GradientBoostingRegressor() # 建立梯度增强回归模型对象
测试回归的指数这边显示了四种
#explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自
#explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因变量
#的方差变化,值越小则说明效果越差。
#mean_absolute_error:平均绝对误差(Mean Absolute Error,MAE),用于评估预测结果和真实数据集的接近程度的程度
#,其其值越小说明拟合效果越好。
#mean_squared_error:均方差(Mean squared error,MSE),该指标计算的是拟合数据和原始数据对应样本点的误差的
#平方和的均值,其值越小说明拟合效果越好。
#r2_score:判定系数,其含义是也是解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因
#变量的方差变化,值越小则说明效果越差。
model_metrics_name = [explained_variance_score, mean_absolute_error, mean_squared_error, r2_score] # 回归评估指标对象集
model_metrics_list = [] # 回归评估指标列表
for i in range(5): # 循环每个模型索引
tmp_list = [] # 每个内循环的临时结果列表
for m in model_metrics_name: # 循环每个指标对象
tmp_score = m(test_y, pre_y_list[i]) # 计算每个回归指标结果
tmp_list.append(tmp_score) # 将结果存入每个内循环的临时结果列表
model_metrics_list.append(tmp_list) # 将结果存入回归评估指标列表
调参可以在官网搜索SVR进行查阅
sklearn.svm.SVR(kernel ='rbf',degree = 3,gamma ='auto_deprecated',coef0 = 0.0,tol = 0.001,C = 1.0,epsilon = 0.1,shrinking = True,cache_size = 200,verbose = False,max_iter = -1 )
kernel : string,optional(default ='rbf')
指定要在算法中使用的内核类型。它必须是'linear','poly','rbf','sigmoid','precomputed'或者callable之一。如果没有给出,将使用'rbf'。如果给出了callable,则它用于预先计算内核矩阵。
degree: int,可选(默认= 3)
多项式核函数的次数('poly')。被所有其他内核忽略。
gamma : float,optional(默认='auto')
'rbf','poly'和'sigmoid'的核系数。
当前默认值为'auto',它使用1 / n_features,如果gamma='scale'传递,则使用1 /(n_features * X.std())作为gamma的值。当前默认的gamma''auto'将在版本0.22中更改为'scale'。'auto_deprecated','auto'的弃用版本用作默认值,表示没有传递明确的gamma值。
coef0 : float,optional(默认值= 0.0)
核函数中的独立项。它只在'poly'和'sigmoid'中很重要。
tol : float,optional(默认值= 1e-3)
容忍停止标准。
C : float,可选(默认= 1.0)
错误术语的惩罚参数C.
epsilon : float,optional(默认值= 0.1)
Epsilon在epsilon-SVR模型中。它指定了epsilon-tube,其中训练损失函数中没有惩罚与在实际值的距离epsilon内预测的点。
收缩 : 布尔值,可选(默认= True)
是否使用收缩启发式。
cache_size : float,可选
指定内核缓存的大小(以MB为单位)。
详细说明 : bool,默认值:False
启用详细输出。请注意,此设置利用libsvm中的每进程运行时设置,如果启用,则可能无法在多线程上下文中正常运行。
max_iter : int,optional(默认值= -1)
求解器内迭代的硬限制,或无限制的-1
6.分类、回归方法中心思想个人理解汇总
6.1 KNN
6.11 分类
KNN 全程是K-NearestNeighbors, 也就是K个距离最近的邻居,专业术语是K最近邻分类算法。
也就是拿这个点周边K个点作为分类的标准,比如下图绿色圆圈在(k=3)的情况下为三角形
6.12回归
KNN计算某个数据点的预测值时,模型从训练数据集中选择离该数据点最近的k个数据点,并且把这些数据的y值取均值,把求出的这个均值作为新数据点的预测值。
6.2 SVM
6.21 分类
中心思想:求解能够正确划分训练数据集并且几何间隔最大的分离超平面
也就是 wx + b = 0
支持向量机(support vector machines, SVM)是一种二分类模型。SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化。
多分类情况下,可以分为多种方法。
a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。
b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。
c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止,也就是不断分层。
6.22 回归
中心思想:
- 在 Margin 区域内的样本点越多,则 Margin 区域越能够较好的表达样本数据点,此时,取 Margin 区域内中间的那条直线作为最终的模型;用该模型预测相应的样本点的 y 值;
- 在具体训练 SVM 算法模型解决回归问题时,提前指定 Margin 的大小,算法引入的超参数:ε,表示 Margin 区域的两条直线到区域中间的直线的距离,如图:
- SVM 解决回归问题的思路与解决分类问题的思路相反,解决分类问题时,希望 Margin 区域内没有样本点或者样本点尽可能的少;
6.3 DecisionTree
6.31 分类
决策树通过树形结构来对数据样本进行分类。一棵完整的结构树由结点和有向边构成,其中内部结点表示特征,叶子结点表示类别,决策树从根结点开始,选取数据中某一特征,根据特征取值对实例进行分配,通过不断地选取特征进行实例分配,决策树可以达到对所有实例进行分类的目的。
决策树学习的目标就是基于数据归纳出这样的一组规则。
针对特征值选择,有三种方式来选取最优特征,包括信息增益、信息增益比和基尼指数。
熵:
信息增益(information gain)则定义为由于得到特征X的信息而使得类Y的信息不确定性减少的程度,即信息增益是一种描述目标类别确定性增加的量,特征的信息增益越大,目标类的确定性越强。
信息增益比:针对某个特征分类取值过多的情况,往往使得其信息增益远远大于其他特征从而失去意义。特征A对数据集D的信息增益比可以定义为其信息增益g(D,A)与数据集D关于特征A取值的熵EA(D)的比值。
基尼指数:基尼指数是针对概率分布而言的
6.32 回归
详细计算过程可以:Regression Tree 回归树 - 知乎
主要思想是在于寻找最优切分变量j和最优切分点s。
如第一步s=5
上述算法达到最小值
6.4 GBR
Gradient Boosting 的基本思想是:串行地生成多个弱学习器,每个弱学习器的目标是拟合先前累加模型的损失函数的负梯度,使加上该弱学习器后的累积模型损失往负梯度的方向减少。
6.5 Naive Bayes
朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布(朴素贝叶斯法这种通过学习得到模型的机制,显然属于生成模型);然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。
6.6 RandomForest
6.6.1 分类
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树。
其实从直观角度来解释,每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。
6.6.2 回归
随机森林在不同的随机选择的样本子集上训练每个决策树,然后对预测取平均以进行整体预测。应该是和决策树回归分析是类似的,也是通过区域的平均值作为回归数值。
7.调参(还未尝试)
针对GBR
# 调参小技巧
# 根据要解决的问题选择损失函数
# n_estimators尽可能大(如3000)
# 通过grid search方法对max_depth, learning_rate, min_samples_leaf, 及max_features进行寻优
# 增加n_estimators,保持其它参数不变,再次对learning_rate调优
8. Grid Search
Grid Search是一种调参的手段,即穷举,穷举所有的超参组合,因此适用于小数据。
针对GBR
参数:
1. n_estimators(迭代次数)
Bug:
ValueError: Parameter values for parameter (n_estimators) need to be a sequence.
此函数输出的是 range型数据,而要求需要是序列类型,即list型数据,所以将range类型转为list类型数据即可!
处理方式:将range(200,401,10)改成list(range(200,401,10))
#超参
from sklearn.grid_search import GridSearchCV
from sklearn import ensemble
param_test1 = {'n_estimators':list(range(200,401,10))}
gsearch1=GridSearchCV(estimator=GradientBoostingRegressor(learning_rate=0.1,min_samples_split=300,min_samples_leaf=20,max_depth=8,max_features='sqrt',subsample=0.8,random_state=10),
param_grid = param_test1, scoring='r2',iid=False,cv=5)
gsearch1.fit(x,y.ravel())
print(gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_)
我这边选择出来的是 n_estimators=290
2. learning_rate(步长)步长初始值设置为0.1(可以最后调,适当调低,提高泛化能力)
对决策树进行调参
3. max_depth(最大深度)
我这边选择出来的是 max_depth=7
4. min_samples_split(最小样本数)
我这边选择出来的是 min_samples_split=80
5. min_samples_leaf(叶子节点最少样本数)
我这边选择出来的是 min_samples_leaf=1000
param_test3 = {'min_samples_split':list(range(800,1900,200)), 'min_samples_leaf':list(range(60,101,10))}
gsearch3 = GridSearchCV(estimator = GradientBoostingRegressor(learning_rate=0.1, n_estimators=290,max_depth=7,
max_features='sqrt', subsample=0.8, random_state=10),
param_grid = param_test3, scoring='r2',iid=False, cv=5)
gsearch3.fit(x,y.ravel())
print(gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_)
6. max_features(最大特征数)
这边我最开始设置的就是9个特征值
7. subsample(子样本)
这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差。
#subsample
param_test5 = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gsearch5 = GridSearchCV(estimator = GradientBoostingRegressor(learning_rate=0.1, n_estimators=290,max_depth=7, min_samples_leaf =80,
min_samples_split =1000, random_state=10),
param_grid = param_test5, scoring='r2',iid=False, cv=5)
gsearch5.fit(x,y.ravel())
print(gsearch5.grid_scores_, gsearch5.best_params_, gsearch5.best_score_)
类似查找结果呈现:
显示每个的结果,最后为最佳的参数。
最终通过调参差不多能将0.91提升到0.946