<small id='gQ0OdW'></small> <noframes id='0LQv'>

  • <tfoot id='9i4oxqNuFG'></tfoot>

      <legend id='UcI4vw5'><style id='5KHIwDMfZp'><dir id='rzqImcCT'><q id='ncSZv6OWgl'></q></dir></style></legend>
      <i id='SVdi1Y0h'><tr id='8MN7kgZni2'><dt id='pkMsz6Uv'><q id='iI6cHTg'><span id='cpAO'><b id='0E6p53RHru'><form id='7mqva1l4g'><ins id='UGt8NzV'></ins><ul id='8RU64'></ul><sub id='4q7CPOfIwA'></sub></form><legend id='flSt'></legend><bdo id='lPyhRufU'><pre id='7TfyWDg9o'><center id='bnfhN'></center></pre></bdo></b><th id='f4Vycog'></th></span></q></dt></tr></i><div id='6Szvh9'><tfoot id='L80fB74'></tfoot><dl id='ukvTJG7D4'><fieldset id='Gyktp'></fieldset></dl></div>

          <bdo id='RqZ2mxWJ'></bdo><ul id='ZEUHfbX'></ul>

          1. <li id='ivF0Rr'></li>
            登陆

            1号站注册-Python实战教程:回绝调包,如何用python推导线性回归模型

            admin 2019-12-15 280人围观 ,发现0个评论

            最近有人问我一个问题,我数学欠好,代码基础薄弱,英语一般般,怎样入门当今最为前沿的机器学习范畴?均方差丢失,MSE,平方丢失函数,二次价值函数都是什么意思?

            这个问题问得好,比方学好数学,多敲代码,霸占专八这类规范答复我就不多说了。咱们这回用Python实战教程事例,分分钟带你入门。

            下面咱们经过机器学习的入门模型——线性回归,从数学说起,以代码着手,一步步推导出能够应用于实践的模型。

            线性回归的数学原理

            首要,先看一张图:

            图是咱们在初中学习过的直角坐标系二维平面,上面遍及着一些点。从全体趋势看,y随x的增大而增大。假如从前你和我相同,数学每次考试都是90的话,那么接下来,我相信你会情不自禁地做一件事:

            没错,咱们会以(0,0)和(10,10)为两点,画出一条贯穿其间的线,从视觉上,这条红线正好把一切点一分为二,其对应的数学表达式为:

            y=x

            而这便是咱们线性回归所要做的事:找到一组数学表达式(图中的红线),用来反映数据(图中的点)的改变规则。

            方针有了,问题也来了:

            贯穿图中鳞次栉比点的线有很多条,为什么不是y=2x,y=x+1,偏偏是y=x呢?

            咱们又是经过何种办法去找到这条线呢?

            先处理第一个问题,上天书:

            这个式子便是第一个问题的解,没见过的符号太多,看不懂是吧?那么我来翻译一下:

            1. 先求出(每个点的Y值-以每个点的X值经过函数求出的Y值)的平方
            2. 求和;
            3. 乘以1/2

            再浅显点:

            把每个点的实践y值与它经过某个函数求出的y值的差的平方加起来,再乘以1/2。

            而文章开篇中的均方差丢失,MSE,平方丢失函数,二次价值函数其实都指的是它。这个式子其实核算的是实在值和用函数猜测的值之间的差错之和。那么第一个问题就便利的处理了:哪一个表达式所求出的差错和最小,便是咱们要找的那条“红线”。

            咱们持续处理第二个问题,先上图:

            这个问题还要简略,咱们只要从斜率为0的那条“红线”(y=0*X)开端画线,然后一点点增大斜率,每条线求一个差错值,找出其间差错值最小的那条线,就功德圆满了。而中心有着巨大1号站注册-Python实战教程:回绝调包,如何用python推导线性回归模型核算量的遍历进程,咱们能够经过python,瞬间完结。

            线性回归的Python完结

            要点:梯度下降法!

            导入一些包,待用:

            import numpy as npimport pandas as pdfrom sklearn.linear_model import LinearRegressionfrom sklearn.preprocessing import MinMaxScalerimport matplotlib.pyplot as pltimport seaborn as snssns.set_context('notebook')sns.set_style('white')

            导入事例数据:

            model_data = pd.read_csv('model_data.csv',engine='python')model_data.head()

            数据是一份上海的房价数据,咱们要把房子价格作为因变量y,房子面积,房间数邻近餐饮POI数量,谈论,间隔市中心间隔等作为自变量,拟合一个线性回归模型,用于猜测房价。

            依据要求提取自变量和因变量:

            feat_cols = model_data.columns.tolist()[1:]print(feat_cols)

            X = model_data[feat_cols].valuesy = m91撸odel_data['价格'].values

            构建丢失函数:

            def Cost_Function(X,y,theta): ''' 需求传入的参数为 X:自变量 y:应变量 theta:权重 运用均方差错(MSE),作为丢失函数 ''' m = y.size #求出y的个数(总共多少条数据) t = X.dot(theta) #权重和变量点乘,核算出运用当时权重时的猜测值 c = 0 #界说丢失值 c = 1/(2*m) * (np.sum(np.square(t-y))) #猜测值与实践值的差值,平方后除以数据的条数,核算出均方差错。终究乘以1/2(无实践含义,便利今后核算) return c #回来丢失值

            *为每个变量前的权重,什么是权重?比方y=2x,2便是自变量x的权重

            求丢失值咱们就用从前提到的丢失函数。假如你够细心,或许会有一个问题,咱们的丢失函数前需求乘以一个1/2,好像没有特别的含义。祝贺你很机敏,1/2确实没有任何含义,仅仅为了接下来便利求导。

            构建梯度下降法:

            def GradientDescent(X, y, feat_cols, alpha=0.3, num_iters=10000): ''' 需传入参数为 X:自变量 y:应变量 feat_cols:变量列表 alpha:学习率,默许0.3 num_iters:迭代次数,默许10000次 运用梯度下降法迭代权重 ''' scaler = MinMaxScaler() #最大最小值归一化自变量 X = scaler.fit_transform(X) #归一化 m = y.size #求出y的个数(总共多少条数据) J_history = np.zeros(num_iters) #创立包容每次迭代后丢失值得矩阵,初始值为0 theta = np.zeros(len(feat_cols)+1) #设置默许权重,0 for iter in np.arange(num_iters): #依据迭代次数,开端迭代 t = X.dot(theta) #权重和变量点乘,核算出运用当时权重时的猜测值 theta = theta - alpha*(1/m)*(X.T.dot(t-y)) #对价值函数求导,算出下降最快的方向,乘以学习率(下降的速度),再用本来的权重相减,得到新的权重 J_history[iter] = Cost_F1号站注册-Python实战教程:回绝调包,如何用python推导线性回归模型unction(X, y, theta) #求出新的权重时的丢失值,存入矩阵 return(theta, J_history) #回来终究的权重和每次迭代的丢失值

            这是结构模型最为中心的部分。咱们不断迭代,寻觅最优的那条“红线”的进程,其实是在不断调整每个自变量的权重。而每个权重每次究竟怎样调整,增大仍是减小(方向),这就需求咱们对丢失函数求导。

            假如数学欠好,不理解,咱们用图来阐明一下:

            比如,咱们站在山崖顶端,要找到最快能到达山崖底部的方向,那么清楚明了,你所在位置最峻峭的方向,便是正确的方向,而求导便是找到最峻峭的方向(切线斜率绝对值最大的点)。

            山坡是高低不平的,所以咱们每走一步都需求从头寻觅方向,这便是迭代的进程;其次,每次的脚步也不能跨太大,万一跨错地方了,欠好纠正,所以咱们又需求设置一个脚步的巨细——学习率。

            所以梯度下降法的公式便是:

            每一次更新的权重= 前一次的权重-学习率X丢失函数的导数。

            有理解了下山这个场景今后,咱们就能顺畅的完结梯度下降法的构建,而且经过python函数求出终究每个变量的权重和每次迭代往后的丢失值。

            构建制作丢失值改变图的函数:

            def plot_Cost(GD_result): ''' 制作权重改变状况 需传入参数为 GD_result:梯度下降法成果 ''' theta , Cost = GD_result #得到权重和丢失值 print('theta: ',theta.ravel()) #打印权重 plt.plot(Cost) #制作丢失值改变状况 plt.title('COST change') plt.ylabel('Cost') plt.xlabel('Iterations') plt.grid() plt.show()

            这个很简略,便是经过前面梯度下降法求得的每次迭代后的丢失值,画出改变曲线。

            终究把一切函数汇总,便是咱们的线性回归模型了:

            def lr_function(X,y,feat_cols): ''' 需求输入的变量为 X:自变量 y:应变量 feat_cols:变量列表 ''' def score(y_p,y): ''' y_p:猜测值 y:实在值 dimension:样本数量 核算R^和调整R^ ''' aa=y_p.copy(); bb=y.copy() if len(aa)!=len(bb): print('not same length') return np.nan cc=aa-bb wcpfh=sum(cc**2) #差错平方和 # RR means R_Square RR=1-sum((bb-aa)**2)/sum((bb-np.mean(bb))**2) return RR#回来R^ X = np.c_[np.ones(X.shape[0]),X] GD_result = GradientDescent(X, y, feat_cols) plot_Cost(GD_result) y_p = np.dot(X,GD_result[0]) RR = score(y_p,y) return RR,y_p,GD_result[0] #回来R^,猜测值

            一般关于每个机器学习模型,都需求有一个目标衡量其拟合程度,而线性模型咱们运用的是咱们所熟知的**可决系数R2**。为了求出R2,

            我在函数中又套用了一个简略的求解函数,详细进程不赘述了,通读代码就能理解。一般R^2越挨近1,表明模型拟合程度越好。

            模型封装结束,下面是见证奇观的时间!

            model_result = lr_function(X,y,feat_cols)print('R^2为:{}'.format(round(model_result[0],4)))

            经过模型,咱们求出了每个自变量的权重,图表反响了丢失值由大变小的进程,在10000次迭代的进程中,一开端速度很快,越到后边越趋于陡峭。

            终究是R^1号站注册-Python实战教程:回绝调包,如何用python推导线性回归模型2为0.70,有70%的拟合度,尚可。

            线性回归模型的验证

            为了验证咱们自己编写的模型是否精确,咱们也能够运用python机器学习工具包sklearn,对相同的数据,用线性回归模型拟合,检查终究的R^2是否共同。

            先对变量规范化:

            scaler = MinMaxScaler()X = scaler.fit_transform(X)

            运用LinearRegression()进行拟合,并求出R^2:

            lr = LinearRegression()lr.fit(X,y)R2 = lr.score(X,y)print('R^2为:{}'.format(round(R2,4)))

            R^2相同为0.7,代表咱们自己编写的模型没有问题。

            终究,咱们制作一张实在值与猜测值比照图,可视化模型成果:

            黑色符号是以实在值为横坐标,猜测值为纵坐标。绿色的线为用sklearn拟合的线性回归模型,赤色的线为运用咱们自己编写的模型拟合的回归线。咱们发现,两条线简直彻底重合在一起,阐明结论是共同的。

            好了,怎样不经过调包,一步步运用数学知识和代码优势复原线性回归模型的办法就讲到这儿。假如,你彻底读懂了上述一切操作,那么我相信你现已入门了。

            关于怎样用python推导线性回归模型的问题就讲到这儿,喜爱就点个重视吧~更多的Python实战教程也会持续为我们更新!

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP