sklearn(三):線性回歸的改進——嶺回歸

1.介紹

對于線性回歸招驴,為了增加模型的泛化能力裤唠,我們可以采用嶺回歸(Ridge Regression)而引入正則項。當然泥张,最好的辦法還是增加訓練樣本呵恢,之后我們會看到增大樣本后的效果。為了方便以后使用媚创,我們這次按照面向對象思想將嶺回歸模型進行封裝(class Ridge_Regression)渗钉。

2.樣本生成

與之前一樣,我們采用sklearn的datasets模塊產生數(shù)據(jù),我們將其定義在init方法內。

def __init__(
        self,
        n_samples=50, 
        n_features=10,
        n_informative=2,
        n_targets=5,
        noise=30,
        bias=10,
        random_state=1,
        x=None,
        y=None
):
    if (x is None) and (y is None):
        self.X, self.y = datasets.make_regression(
            n_samples=n_samples,
            n_features=n_features,
            n_informative=n_informative,
            n_targets=n_targets,
            noise=noise,
            bias=bias,
            random_state=random_state
        )
        self.y = self.y.reshape(n_samples, n_targets)
    elif (x is not None) and (y is not None):
        self.X = np.array(x)
        self.y = np.array(y)
    else:
        raise Exception("Input is invalid!")

3.數(shù)據(jù)預處理

將樣本打亂順序鳄橘,同時分隔數(shù)據(jù)集声离。

def preprocess(self, proportion=0.8):
    n = self.X.shape[0]    # training samples
    n_train = int(n * proportion)
    permutation = np.random.permutation(n)
    self.X, self.y = self.X[permutation], self.y[permutation]
    self.X_train, self.y_train = self.X[:n_train, :], self.y[:n_train, :]
    self.X_test, self.y_test = self.X[n_train:, :], self.y[n_train:, :]
    return self.X_train, self.y_train, self.X_test, self.y_test

4.模型訓練

這里關注alpha參數(shù),表示正則系數(shù)瘫怜。alpha越大术徊,正則懲罰越厲害,alpha=0就是普通的線性回歸模型鲸湃。

def train(self, alpha=0.01, fit_intercept=True, max_iter=10000):
    self.ridge_regressor = linear_model.Ridge(alpha=alpha, fit_intercept=fit_intercept,
                                              max_iter=max_iter)
    self.ridge_regressor.fit(self.X_train, self.y_train)

5.預測與評價

與之前線性回歸一樣赠涮,不多講。

def predict(self, X):
    return self.ridge_regressor.predict(X)

def loss(self, X, y):
    return round(sm.mean_squared_error(X, y), 4)

def variance(self, X, y):
    return round(sm.explained_variance_score(X, y), 4)

6.結果

我們對alpha取0.01, 0.1, 0.5進行測試暗挑。

if __name__ == "__main__":
ridge_regressor = Ridge_Regression()
X_train, y_train, X_test, y_test = ridge_regressor.preprocess(proportion=0.75)
for alpha in [0.01, 0.1, 0.5]:
    ridge_regressor.train(alpha=alpha)
    y_predict_test = ridge_regressor.predict(X_test)
    print("alpha = {}, test loss: {}".format(round(alpha, 2), ridge_regressor.loss(y_test, y_predict_test)))
    print("alpha = {}, variance: {}\n".format(round(alpha, 2), ridge_regressor.variance(y_test, y_predict_test)))

輸出為:

# n_samples = 50
alpha = 0.01, test loss: 1821.4612
alpha = 0.01, variance: 0.1471

alpha = 0.1, test loss: 1796.6773
alpha = 0.1, variance: 0.1571

alpha = 0.5, test loss: 1701.2975
alpha = 0.5, variance: 0.1966

可以看到笋除,增大alpha,test loss有減少炸裆,但是效果并不好垃它,因為我們的variance得分很低,證明方差很大烹看。下面国拇,我們將樣本數(shù)量從50,增大到5000惯殊,看看效果酱吝。

# n_samples = 5000
alpha = 0.01, test loss: 905.622
alpha = 0.01, variance: 0.6951

alpha = 0.1, test loss: 905.6208
alpha = 0.1, variance: 0.6951

alpha = 0.5, test loss: 905.6158
alpha = 0.5, variance: 0.6951

可以看到,loss有明顯下降靠胜,同時variance得分明顯提高掉瞳,這個效果要比ridge regression本身效果要好(也可能是我數(shù)據(jù)產生的不太好毕源,沒太發(fā)揮出來ridge regression模型的效果)浪漠。但是,增大樣本霎褐,毫無疑問是提示模型效果的關鍵手段址愿。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冻璃,隨后出現(xiàn)的幾起案子响谓,更是在濱河造成了極大的恐慌,老刑警劉巖省艳,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘纷,死亡現(xiàn)場離奇詭異,居然都是意外死亡跋炕,警方通過查閱死者的電腦和手機赖晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遏插,你說我怎么就攤上這事捂贿。” “怎么了胳嘲?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵厂僧,是天一觀的道長。 經常有香客問我了牛,道長颜屠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任白魂,我火速辦了婚禮汽纤,結果婚禮上,老公的妹妹穿的比我還像新娘福荸。我一直安慰自己蕴坪,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布敬锐。 她就那樣靜靜地躺著背传,像睡著了一般。 火紅的嫁衣襯著肌膚如雪台夺。 梳的紋絲不亂的頭發(fā)上径玖,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音颤介,去河邊找鬼梳星。 笑死,一個胖子當著我的面吹牛滚朵,可吹牛的內容都是我干的冤灾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼辕近,長吁一口氣:“原來是場噩夢啊……” “哼韵吨!你這毒婦竟也來了?” 一聲冷哼從身側響起移宅,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤归粉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漏峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糠悼,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年浅乔,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔喂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滴劲,靈堂內的尸體忽然破棺而出攻晒,到底是詐尸還是另有隱情,我是刑警寧澤班挖,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布鲁捏,位于F島的核電站,受9級特大地震影響萧芙,放射性物質發(fā)生泄漏给梅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一双揪、第九天 我趴在偏房一處隱蔽的房頂上張望动羽。 院中可真熱鬧,春花似錦渔期、人聲如沸运吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘哨。三九已至,卻和暖如春信峻,著一層夾襖步出監(jiān)牢的瞬間倦青,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工盹舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留产镐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓踢步,卻偏偏與公主長得像癣亚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贾虽,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容