cs229学习问题
notes3 Support Vector Machines
21、如何用机器学习对单个股票下一个交易日涨跌进行预测?
解答:如果用日数据,找到三个因子,学习一个model,用前一个交易日的三个因子数据预测下一个涨跌,数据标准化后都变为0,该怎么办?
20、策略回测时用指数来对冲,实际交易过程中用指数期货来交易,这样是否可行?是否应该用指数期货来回测?
解答:
19、数据预处理和PCA(主成分分析)谁应该先进行?为什么?
解答:可能是先数据预处理,再进行主成分分析。
18、上面写法(注释掉的)和下面写法区别是什么?应该采用哪个更好?
from sklearn import preprocessing # scaler = preprocessing.StandardScaler().fit(X_train) # X_train = scaler.transform(X_train) # X_cv = scaler.transform(X_cv) x_train=preprocessing.scale(X_train) X_cv=preprocessing.scale(X_cv)
解答:
17、为什么下面两行代码结果不一致?会不会是DataFrame的一个bug,分母多除了,本来应该除以2,错误地除以4了。
import pandas as pd import numpy as np y=np.array([[1,2,1,2],[3,4,3,4]]) #scale_fun = lambda x: x.min(axis=0)-x.max(axis=0) scale_fun = lambda x: (x - x.mean(axis=0)) / x.std(axis=0) print(scale_fun(y)) print(pd.DataFrame(y).apply(scale_fun,axis=0)) [[-1. -1. -1. -1.] [ 1. 1. 1. 1.]] 0 1 2 3 0 -0.707107 -0.707107 -0.707107 -0.707107 1 0.707107 0.707107 0.707107 0.707107
这是由计算标准差的差异造成的:
pandas中计算标准差用的是极大释然估计量,分母为N,即为2,标准差计算为(((1-2)**2+(3-2)**2)/(2))**0.5=1**0.5=1
np中计算标准差用的是无偏估计量,分母为N-1,即为2-1,标准差计算为(((1-2)**2+(3-2)**2)/(2-1))**0.5=2**0.5
16、机器学习模型太多了,(1)、该如何使用各个模型?(2)、该如何用sklearn模块写代码?
对应:sklearn.linear_model.LinearRegression sklearn.linear_model.Ridge sklearn.linear_model.Lasso sklearn.linear_model.ElasticNet
sklearn.linear_model.LogistickRegression sklearn.linear_model.SGDClassifier sklearn.linear_model.SGDClassifier
根据 sklearn algorithm cheat-sheet 流程图可知,主要模型如下:
regression 回归
SGD Regression sklearn.linear_model.SGDRegressor
dimensionality reduction 降维
Randomized PCA--->(not working)--->kernel approximation 核近似 sklearn.decomposition.PCA() sklearn.decomposition.KernelPCA()
sklearn.decomposition.RandomizedPCA() to be removed in 0.20
classification 分类
SGD Classifier--->(not working)--->kernel approximation sklearn.linear_model.SGDClassifier ???kernel???
clustering 聚合
number of categories known--->MiniBatch KMeans
个人看法:如果对股票聚合,前提是知道将股票分为几类,但一般不可知,聚合可能不适合。
15、如何衡量学习结果如何?
svm:metrics.accuracy_score(y_curr_month,y_pred_curr_month) metrics.roc_auc_score(y_curr_month,y_score_curr_month))
linear:
14、sklearn中linear_model.SGDClassifier中y_train是用的标签还是直接用的选取后的return?
http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_separating_hyperplane.html#sphx-glr-auto-examples-linear-model-plot-sgd-separating-hyperplane-py
解答:通过上面例子,应该是标签。分类预测的是标签。
13、机器学习中一个model在测试集中没有更新,直观来说,应该时刻更新,用到最新的数据做预测,如何做到这一点呢?
12、SVM机器学习中,分类测试结果时好时坏,该怎么处理?
11、如何理解:w*x+b=0,对于特征空间R中的一个超平面S,其中w是超平面的法向量,b是超平面的截距,这个超平面将特征空间划分为两个部分,位于两部分的点(特征向量)分别被分为正负两类。因此,超平面S称为分离超平面。
解答:超平面的法向量为超平面方程前面系数,位于超平面下方的点与超平面相乘后加上截距项必然为负,因为x往下移动过,同理位于超平面上方的点。
10、监督学习假设输入与输出的随机变量X和Y遵循联合概率分布P(X,Y)。P(X,Y)表示分布函数,或分布密度函数。统计学习假设数据存在一定的统计规律,X和Y具有联合概率分布的假设就是监督学习关于数据的基本假设?为什么是这样的?
解答:
9、统计学习三要素:模型、策略和算法。策略、算法分别是什么含义?
数学模型:一个或一组代数方程、微分方程、差分方程、积分方程或统计学方程,通过这些方程定量或定性地描述各变量之间的相互关系或因果关系。
数学模型描述的是系统的行为和特征,而不是系统的实际结构。
解答,策略:即考虑按照什么样的准则学习或选择最优的模型,统计学习目的在于从假设空间中选取最优模型。引入损失函数、风险函数、经验风险最小化与结构风险最小化。
监督学习的问题就变成了经验风险或结构风险函数的最优化问题,这时经验或结构风险函数是最优化的目标函数。
算法:学习模型的具体计算方法。统计学习基于训练数据集,根据学习策略,从假设空间中选择最优模型,最后需要考虑用什么样的计算方法求解最优模型。
算法(Algorithm):解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
一个算法应该具有五个重要特性:有穷性、确切性、输入项、输出项、可行性。
算法评定标准:时间复杂度、空间复杂度、正确性、可读性、健壮性。
算法的方法:递推法、递归法、穷举法(暴力破解法)、贪心算法、分治法、动态规划法、迭代法、分支界限法、回溯法。
统计学习关于数据的基本假设是同类数据具有一定的统计规律性。统计学习的方法是基于数据构建统计模型从而对数据进行预测与分析。
统计学习的方法可以概括如下:从给定的、有限的、用于学习的训练数据(training data)集合出发,假设数据是独立同分布产生的;并且假设要学习的模型属于某个函数的集合,称为假设空间(hypothesis space);应用某个评价准则(evaluation criterion),从假设空间中选取一个最优的模型,使它对已知训练数据及未知测试数据(test data)在给定的评价准则下有最优的预测;
8、如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分为三部分,分别为训练集、验证集和测试集。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。
问题:1、一般的机器学习好像没有这么复杂,划分这么多。一个训练,再用训练的模型进行预测?
2、如何进行验证,如何进行单独的验证,即剥离训练集后的验证?如何比较不同模型之间好坏,即评价不同验证结果的标准?
3、验证集和交叉验证是一个概念吗?
hutai流程为:训练+验证 ----> 测试
7、约束最优化问题如何求解?
解答:scipy库感觉不太好用,太复杂了,可以算出部分问题,但是算出的结果有问题。
统计学习方法(李航)
例子7.1
import numpy as np from scipy.optimize import minimize,Bounds,rosen,rosen_der,rosen_hess from scipy.optimize import LinearConstraint def func(x): return .5*(x[0]**2+x[1]**2) linear_constraint=LinearConstraint([[3,3,1],[4,3,1],[-1,-1,-1]],[1,1,1],[np.inf,np.inf,np.inf]) x0=np.array([0,0,0]) res=minimize(func,x0,method='trust-constr',jac=rosen_der,hess=rosen_hess, constraints=[linear_constraint],options={'verbose':1}) print(res.x) #x: array([ 0.76741137, 0.23306446, -2.00048511]) 不是全局最优解 print('\n--------------------') from scipy.optimize import SR1 res=minimize(func,x0,method='trust-constr',jac='2-point',hess=SR1(), constraints=[linear_constraint],options={'verbose':1}) print(res)
运行结果: `xtol` termination condition is satisfied. Number of iterations: 343, function evaluations: 666, CG iterations: 416, optimality: 2.73e+00, constraint violation: 0.00e+00, execution time: 0.43 s. [ 0.76741137 0.23306446 -2.00048511] -------------------- `gtol` termination condition is satisfied. Number of iterations: 18, function evaluations: 48, CG iterations: 25, optimality: 1.35e-09, constraint violation: 0.00e+00, execution time: 0.033 s. [ 0.50002438 0.50001157 -2.0000518 ]
例子7.2
import numpy as np from scipy.optimize import minimize,Bounds,rosen,rosen_der,rosen_hess from scipy.optimize import LinearConstraint,NonlinearConstraint def func(x): return .5*(18*x[0]**2+25*x[1]**2+2*x[2]**2+42*x[0]*x[1]-12*x[0]*x[2]-14*x[1]*x[2])-x[0]-x[1]-x[2] from scipy.optimize import Bounds bounds=Bounds([0,0,0],[np.inf,np.inf,np.inf]) linear_constraint=LinearConstraint([[1,1,-1]],[0,0,0],[0,0,0]) eq_cons={'type':'eq', 'fun':lambda x:np.array([x[0]+x[1]-x[2]]), 'jac':lambda x:np.array([1.0,1.0,-1.0])} x0=np.array([1,1,2]) res=minimize(func,x0,method='SLSQP',jac=rosen_der,bounds=bounds,constraints=[eq_cons], options={'ftol': 1e-9, 'disp': True}) print(res.x) print('-------------------------') res=minimize(func,x0,method='SLSQP',bounds=bounds,constraints=[eq_cons],) print(res.x)
运行结果: Iteration limit exceeded (Exit mode 9) Current function value: 20.842654044864997 Iterations: 101 Function evaluations: 1101 Gradient evaluations: 101 [1.01452196 1.1839437 2.19846565] ------------------------- [0.24999998 0. 0.24999998]
6、为啥距离是垂直的垂线,而不是对应的y值?
解答:数据点离划分的超平面距离越远时,越确定划分准确。距离非y值,而是垂线。
5、为啥超平面是唯一的呢?超平面可能不唯一吧?如果人为制造平行的样本点。
解答:由4可知,超平面是唯一的。
4、为啥函数间隔转化为:定义超平面(w,b)关于训练数据集T的函数间隔为超平面(w,b)关于T中所有样本点(x(i),y(i))的函数间隔之最小值?
解答:注意这只是一个定义,没有说明别的问题。定义的是函数间隔,选取的是所有距离中最小的,没问题。
3、如果在2维平面上,数据量比较大,从xoy的坐标上可以看到两条直线,分别为y=1和y=-1,那该怎么划分呢?
解答:当数据点变为两条直线后,划分的超平面为经过y=0直线的平面(非xoy平面),只有当这个平面的垂线为x=0时,数据到这个平面的距离最大,想象一下。
2、欧式空间和希尔伯特空间是什么意思?
欧式空间可基本理解我们认识的空间。
1、分类式子 h(x)=g(wTx+b),x和w、b分别是什么形式和维度?
解答:x为维度,比如2维平面 h(x)=2*x+1 3维平面 h(x)=2*x(1)+3*x(2)+3,其中x=[x(1),x(2)],w=[2,3],b=3