Julia MLJ 邏輯回歸 機(jī)器學(xué)習(xí) 梯度下降 調(diào)參 kaggle數(shù)據(jù)集

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.    
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.5.0-rc1.0 (2020-06-26)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release  
|__/                   |
數(shù)據(jù)集字段概覽

這是一個(gè)已知用戶的各種屬性, 預(yù)測(cè)用戶是否會(huì)購(gòu)買車險(xiǎn)(Response)的標(biāo)準(zhǔn)分類問(wèn)題. 數(shù)據(jù)集大家可以去kaggle自行下載.

  1. 載入數(shù)據(jù)
using Queryverse, MLJ, StatsKit, PrettyPrinting, LossFunctions, Plots
train_data = Queryverse.load("D:\\data\\archive\\train.csv") |> DataFrame
test_data = Queryverse.load("D:\\data\\archive\\test.csv") |> DataFrame

"|>" 是Julia的管道函數(shù), 等效于R的"%>%". 作用是將上一個(gè)結(jié)果作為下一個(gè)函數(shù)的參數(shù)傳入. 在上述語(yǔ)句中:是將讀取的數(shù)據(jù)轉(zhuǎn)換為DataFrame類型

  1. 查看數(shù)據(jù)的科學(xué)類型(Scitype)
train_data |> MLJ.schema
MLJ.schema

可以看到返回了兩種類型:
1.types (機(jī)器類型)
2.scitypes (科學(xué)類型)
機(jī)器類型很好理解, 與R, python, SQL一樣, 代表數(shù)據(jù)的存儲(chǔ)類型. 科學(xué)類型是MLJ庫(kù)為方便模型理解而定義的類型, 不同的模型兼容的科學(xué)類型也不同, 使用時(shí)需要注意.
詳細(xì)說(shuō)明文檔里有

  1. 查看訓(xùn)練集統(tǒng)計(jì)摘要
train_data |> describe |> print

│ Row │ variable             │ mean     │ min      │ median   │ max       │ nunique │ nmissing │ eltype   │
│     │ Symbol               │ Union…   │ Any      │ Union…   │ Any       │ Union…  │ Nothing  │ DataType │
├─────┼──────────────────────┼──────────┼──────────┼──────────┼───────────┼─────────┼──────────┼──────────┤
│ 1   │ id                   │ 190555.0 │ 1        │ 190555.0 │ 381109    │         │          │ Int64    │
│ 2   │ Gender               │          │ Female   │          │ Male      │ 2       │          │ String   │
│ 3   │ Age                  │ 38.8226  │ 20       │ 36.0     │ 85        │         │          │ Int64    │
│ 4   │ Driving_License      │ 0.997869 │ 0        │ 1.0      │ 1         │         │          │ Int64    │
│ 5   │ Region_Code          │ 26.3888  │ 0.0      │ 28.0     │ 52.0      │         │          │ Float64  │
│ 6   │ Previously_Insured   │ 0.45821  │ 0        │ 0.0      │ 1         │         │          │ Int64    │
│ 7   │ Vehicle_Age          │          │ 1-2 Year │          │ > 2 Years │ 3       │          │ String   │
│ 8   │ Vehicle_Damage       │          │ No       │          │ Yes       │ 2       │          │ String   │
│ 9   │ Annual_Premium       │ 30564.4  │ 2630.0   │ 31669.0  │ 540165.0  │         │          │ Float64  │
│ 10  │ Policy_Sales_Channel │ 112.034  │ 1.0      │ 133.0    │ 163.0     │         │          │ Float64  │
│ 11  │ Vintage              │ 154.347  │ 10       │ 154.0    │ 299       │         │          │ Int64    │
│ 12  │ Response             │ 0.122563 │ 0        │ 0.0      │ 1         │         │          │ Int64    │

id: 對(duì)訓(xùn)練模型沒(méi)有幫助需要剔除
Gender, Driving_License, Region_Code, Previously_Insured, Previously_Insured, Vehicle_Age, Vehicle_Damage, 以及Response: 分類變量處理為one-hot編碼

  1. 查看正負(fù)樣本是否均衡
train_data.Response |> StatsKit.countmap
StatsKit.countmap

正負(fù)樣本不均衡, 選擇后續(xù)在模型中處理. (也可在測(cè)試集中做欠采樣)

  1. 從訓(xùn)練集中剔除id變量
train_data = train_data[:, Not(:id)]
  1. 拆包 - 將數(shù)據(jù)分為預(yù)測(cè)變量和目標(biāo)變量
y, X = unpack(train_data, ==(:Response), colname -> true)
MLJ.unpack
  1. 先用自動(dòng)轉(zhuǎn)換科學(xué)類型方法, 將預(yù)測(cè)變量轉(zhuǎn)換為模型可接受的科學(xué)類型
X = coerce(X, autotype(X)) #先對(duì)訓(xùn)練集自動(dòng)轉(zhuǎn)換scitype為學(xué)習(xí)支持類型
微信截圖_20200928201525.jpg

預(yù)測(cè)變量的被轉(zhuǎn)換成了三種科學(xué)類型: 無(wú)序分類, 有序因子, 連續(xù)數(shù)值

  1. 連續(xù)數(shù)值化
X = MLJ.transform(fit!(machine(ContinuousEncoder(drop_last = true), X)), X)
  1. 標(biāo)準(zhǔn)化
X = MLJ.transform(fit!(machine(Standardizer(), X)), X)
Standardizer

為提高梯度下降效率, 將數(shù)據(jù)標(biāo)準(zhǔn)化為標(biāo)準(zhǔn)差=1, 均值=0

  1. 將目標(biāo)變量的科學(xué)類型轉(zhuǎn)換為OrderedFactor
y = coerce(y, OrderedFactor)
  1. 查看邏輯回歸學(xué)習(xí)器參數(shù)
info("LogisticClassifier", pkg = "ScikitLearn") |> pprint

[ Info: Training Machine{ContinuousEncoder} @192.
name = "LogisticClassifier",
 package_name = "ScikitLearn",
 is_supervised = true,
 docstring = "Logistic regression classifier.\n→ based on [ScikitLearn](https://github.com/cstjean/ScikitLearn.jl).\n→ do `@load LogisticClassifier pkg=\"ScikitLearn\"` to use the model.\n→ do `?LogisticClassifier` for documentation.",  
 hyperparameter_ranges = (nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing, nothing),
 hyperparameter_types = ("String", "Bool", "Float64", "Float64", "Bool", "Float64", "Any", "Any", "String", "Int64", "String", "Int64", "Bool", "Union{Nothing, Int64}", "Union{Nothing, Float64}"),
 hyperparameters = (:penalty, :dual, :tol, :C, :fit_intercept, :intercept_scaling, :class_weight, :random_state, :solver, :max_iter, :multi_class, :verbose, :warm_start, :n_jobs, :l1_ratio),
 implemented_methods = [:clean!, :fit, :fitted_params, :predict],
 is_pure_julia = false,
 is_wrapper = true,
 load_path = "MLJScikitLearnInterface.LogisticClassifier",
 package_license = "BSD",
 package_url = "https://github.com/cstjean/ScikitLearn.jl",
 package_uuid = "3646fa90-6ef7-5e7e-9f22-8aca16db6324",
 prediction_type = :probabilistic,
 supports_online = false,
 supports_weights = false,
 input_scitype = Table{_s24} where _s24<:(AbstractArray{_s23,1} where _s23<:ScientificTypes.Continuous),
 target_scitype = AbstractArray{_s267,1} where _s267<:Finite,
 output_scitype = Unknown)
  1. 載入模型
@load LogisticClassifier pkg="ScikitLearn"

lc = LogisticClassifier(class_weight = "balanced",  #由于樣本不均衡, 讓模型自動(dòng)計(jì)算權(quán)重
                        solver = "sag") #優(yōu)化算法選擇 隨機(jī)梯度下降
  1. 訓(xùn)練模型
r = range(lc, :max_iter, lower = 100, upper = 500) #選擇測(cè)試提升輪數(shù)的范圍

tm = TunedModel(model = lc,
                tuning = Grid(), #參數(shù)范圍的搜索策略
                resampling = CV(rng = 11, nfolds = 10),
                range = [r], #參數(shù)范圍
                measure = area_under_curve #判斷最優(yōu)結(jié)果的指標(biāo) ROC曲線下面積
                )

mtm = machine(tm, X, y)  #構(gòu)造machine(學(xué)習(xí)器)

fit!(mtm) #擬合已調(diào)整的模型


[ Info: Training Machine{ProbabilisticTunedModel{Grid,…}} @931.
[ Info: Attempting to evaluate 10 models.
Evaluating over 10 metamodels: 100%[=========================] Time: 0:07:00

14.可視化調(diào)參結(jié)果

res = report(mtm).plotting
scatter(res.parameter_values[:,1],
        res.measurements)
scatter
best_model = fitted_params(mtm).best_model #查看模型最佳參數(shù)
best_model

max_iter = 278時(shí), AUC最大(ROC曲線下面積)

15.同樣的轉(zhuǎn)換方法處理預(yù)測(cè)集

test_data |> describe |> pprint
id = test_data[:, :id]
test_data = select(test_data, Not(:id))

test_data = coerce(test_data, autotype(test_data)) #自動(dòng)scitype
test_data = MLJ.transform(fit!(machine(ContinuousEncoder(drop_last = true), test_data)), test_data) #數(shù)值化scitype
test_data = MLJ.transform(fit!(machine(Standardizer(), test_data)), test_data) #標(biāo)準(zhǔn)化
test_data
  1. 用訓(xùn)練好的模型進(jìn)行預(yù)測(cè)
result = predict_mode(mtm, test_data)
predict_mode
  1. 查看結(jié)果比例
result |> countmap
countmap
  1. 將id與預(yù)測(cè)結(jié)果合并至DataFrame
result_data = DataFrame(id = id, Response = result)
result_data
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子主穗,更是在濱河造成了極大的恐慌泻拦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽媒,死亡現(xiàn)場(chǎng)離奇詭異争拐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晦雨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門陆错,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人金赦,你說(shuō)我怎么就攤上這事音瓷。” “怎么了夹抗?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵绳慎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我漠烧,道長(zhǎng)杏愤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任已脓,我火速辦了婚禮珊楼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘度液。我一直安慰自己厕宗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布堕担。 她就那樣靜靜地躺著已慢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霹购。 梳的紋絲不亂的頭發(fā)上佑惠,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音齐疙,去河邊找鬼膜楷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贞奋,可吹牛的內(nèi)容都是我干的赌厅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忆矛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼察蹲!你這毒婦竟也來(lái)了请垛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤洽议,失蹤者是張志新(化名)和其女友劉穎宗收,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亚兄,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡混稽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了审胚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匈勋。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膳叨,靈堂內(nèi)的尸體忽然破棺而出洽洁,到底是詐尸還是另有隱情,我是刑警寧澤菲嘴,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布饿自,位于F島的核電站,受9級(jí)特大地震影響龄坪,放射性物質(zhì)發(fā)生泄漏昭雌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一健田、第九天 我趴在偏房一處隱蔽的房頂上張望烛卧。 院中可真熱鬧,春花似錦妓局、人聲如沸总放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)间聊。三九已至,卻和暖如春抵拘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背型豁。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工僵蛛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迎变。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓充尉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親衣形。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驼侠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355