python機械学習sklearn一般化線形モデル

6411 ワード

広義の線形モデルは最もよく使われていて、私個人が最も重要だと思っています.
  • 最小二乗
  • class  sklearn.linear_model. LinearRegression (fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)
    fit_intercept=Trueは断面積を計算するか否かを表し、最後のY=w 1 X 1+w 2 X 2+bのbであり、normalizeはいずれも標準化が必要であることを表す
    from sklearn import linear_model
    reg = linear_model.LinearRegression()
    reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
    reg.coef_
  • 嶺回帰
  • これは上の最適化であり,係数収縮量を制御する複雑なパラメータとなっている:の値が大きいほど収縮量が大きくなり,係数対共線形性のロバスト性もより強くなる
    class  sklearn.linear_model. Ridge (alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto', random_state=None)
    Alphaは式の上のalphaで、正則の話のパラメータ、後のいくつかは最小の二乗と同じです
    solverの選択は、{"auto"、"svd"、"cholesky"、"sparse_cg"、"lsqr"、"sag"}のリストです.
    'auto'データ型に基づいてソルバを自動的に選択します.'svd′はXの奇異値分解を用いて嶺係数を計算する.cholesky'は標準のscipyを使用します.linalg.solve関数は閉じた形式の解決策を得る.sparse_cg'はscipyを使用する.sparse.linalg.cgにおける共役勾配ソルバ;lsqr′は専用の正規化最小二乗ルーチンscipyを用いる.sparse.linalg.lsqr;'sag'ランダム平均勾配降下を用いる
    from sklearn.linear_model import Ridge
    import numpy as np
    n_samples, n_features = 10, 5
    np.random.seed(0)
    y = np.random.randn(n_samples)
    X = np.random.randn(n_samples, n_features)
    clf = Ridge(alpha=1.0)
    clf.fit(X, y) 
    

    一部のマトリクスでは、マトリクス内の要素の小さな変動が、最終的な計算結果の誤差を大きく引き起こし、このマトリクスを「病的マトリクス」と呼ぶ.不正確な計算方法では、正常なマトリクスが演算中に病態を示すこともあります.ガウス消去法では,主元(すなわち対角線上の元素)上の元素が小さい場合,計算時に病態の特徴を示す.
    回帰解析でよく用いられる最小二乗法は無バイアス推定である.1つの適定問題に対して、Xは通常列満ランクの最小二乗法を採用し、損失関数を残差の二乗として定義する.損失関数を最小化する上述の最適化問題は勾配降下法を採用して解くことができる.また、Xが列満ランクでない場合、またはいくつかの列間の線形相関が比較的大きい場合、行列式は0に近い.すなわち,奇異に近づき,上記の問題が不適切な問題となり,計算時の誤差が大きくなり,従来の最小二乗法は安定性と信頼性に欠けている.上記の問題を解決するために、私たちは不適切な問題を適切な問題に変換する必要があります:私たちは上記の損失関数に正規化項を加えて、その中になって、私たちは定義して、そこで:上式の中で、単位行列です.増大するにつれて,各要素の絶対値はいずれも小さくなり続け,それらの正確な値に対するばらつきもますます大きくなる.無限大になると0になる.その中で、変化に伴って変化する軌跡を嶺跡と呼ぶ.実際の計算では非常に多くの値を選択して、どの値を取るときに安定しているかを見て、嶺跡図を作成し、値を決定します.
    嶺回帰は最小二乗回帰に対する補完であり,無偏性を損失し,高い数値安定性を取り替え,より高い計算精度を得た.
    PS:奇異行列は行列式=0である.行列式のベクトルに線形相関があることを表しています.線形相関とは、少なくとも2つのベクトル式Y=AX+Bの関係があることを意味します.つまり、1行のベクトルがまったく機能しないということです.つまり、1つの方程式の中にM個の変数がありますが、M-1個の方程式しかありません.では、方程式を解くことができません.方程式を解くことができない以上、あなたのこの最小二乗の結果は.....ちょっと...間違っていたので、嶺回帰が現れた.(個人的な理解)
    だから属性式は以下の通りです:給料、不動産、......、[label]このようなデータは、最小二乗でフィッティングしないで、嶺回帰を試してみてください.給料と不動産に線形関係があるので、結果は後者に及ばないような気がします(個人的な感じは....テストしたことがありません).もう1つの場合、1つの属性の値はずっと小さくて近いです.例えば、0.000012、0.000011、0.000013などです.このようなデータ、私はこのように1本の属性がかかると感じて、それは1つの方程式の中で1つの属性が役に立たないで、つまり1列はすべて0で、方程式も解けないで、最小二乗でフィッティングしないことを提案します.
    リニア回帰動作原理
        ,     x、    y     x、y 
       x^Tx       
                   w      
    

    リニア回帰開発プロセス
        :           
        :          ,               
        :                          ,               ,               
        :       
        :    R^2             ,        
        :     ,                 ,          ,                         
    

    線形回帰アルゴリズムの特徴
      :      ,      。
      :           。
           :         。

    def loadDataSet(fileName):      #general function to parse tab -delimited floats     numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields      dataMat = []; labelMat = []     fr = open(fileName)     for line in fr.readlines():         lineArr =[]         curLine = line.strip().split('\t')         for i in range(numFeat):             lineArr.append(float(curLine[i]))         dataMat.append(lineArr)         labelMat.append(float(curLine[-1]))     return dataMat,labelMat
    #最小二乗フィット
    def standRegres(xArr,yArr):     xMat = mat(xArr); yMat = mat(yArr).T     xTx = xMat.T*xMat     if linalg.det(xTx) == 0.0:         print "This matrix is singular, cannot do inverse"        return     ws = xTx.I * (xMat.T*yMat)     return ws
    #嶺回帰
    def ridgeRegres(xMat,yMat,lam=0.2):     xTx = xMat.T*xMat     denom = xTx + eye(shape(xMat)[1])*lam     if linalg.det(denom) == 0.0:         print "This matrix is singular, cannot do inverse"        return     ws = denom.I*(xMat.T*yMat)return ws def ridgeTest(xArr,yArr):alphaが異なるため、効果が異なるので、異なるalpha対解が異なるxMat=mat(xArr)を見ることができます.yMat=mat(yArr).T     yMean = mean(yMat,0)     yMat = yMat - yMean     #to eliminate X0 take mean off of Y     #regularize X's     xMeans = mean(xMat,0)   #calc mean then subtract it off     xVar = var(xMat,0)      #calc variance of Xi then divide by it     xMat = (xMat - xMeans)/xVar     numTestPts = 30     wMat = zeros((numTestPts,shape(xMat)[1]))     for i in range(numTestPts):         ws = ridgeRegres(xMat,yMat,exp(i-10))         wMat[i,:]=ws.T     return wMat
  • Lasso回帰(上の嶺回帰は二範数である--最適化理論の第1章は範数である)
  • class  sklearn.linear_model. Lasso (alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')
    パラメータにmax_が1つありますiter,最大反復回数,Lossoは二乗ではなく絶対値計算なので,直接解くことはできず,反復するしかない
    from sklearn import linear_model
    clf = linear_model.Lasso(alpha=0.1)
    clf.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])
    print(clf.coef_)
    print(clf.intercept_)

    Lasso回帰はRidger回帰によって発展したが,あまりにも多くの特徴があれば,この方法を用いることができる.
    線形なので非線形解算より便利です.しかしL 1ノルムのペナルティ項は,絶対値を持ち,導出後に尖点が存在するため,反復アルゴリズムで解く必要があり,直接解析解を得ることはできない.反復解法:
    (1)座標軸降下法
    (2)最小角回帰法(Least Angle Regression,LAR)
    (3)順方向選択法(Forward Selection method)
    (4)前方勾配法(Forward stagewise method)
    逐次前方回帰シミュレーション:def stageWise(xArr,yArr,eps=0.01,numIt=100):xMat=mat(xArr);yMat=mat(yArr).T     yMean = mean(yMat,0)     yMat = yMat - yMean     #can also regularize ys but will get smaller coef     xMat = regularize(xMat)     m,n=shape(xMat)     #returnMat = zeros((numIt,n)) #testing code remove     ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()     for i in range(numIt):         print ws.T         lowestError = inf;          for j in range(n):             for sign in [-1,1]:                 wsTest = ws.copy()                 wsTest[j] += eps*sign                 yTest = xMat*wsTest                 rssE = rssError(yMat.A,yTest.A)                 if rssE < lowestError:                     lowestError = rssE                     wsMax = wsTest         ws = wsMax.copy()         returnMat[i,:]=ws.T     return returnMat