-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
165 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# frozen_string_literal: true | ||
|
||
module Scoruby | ||
module Models | ||
module LogisticRegression | ||
class Data | ||
COEFFICIENTS_VALUES_PATH = '//PMML/GeneralRegressionModel/ParamMatrix/PCell/@beta' | ||
COEFFICIENTS_LABELS_PATH = '//PMML/GeneralRegressionModel/ParameterList/Parameter/@label' | ||
|
||
def initialize(xml) | ||
@xml = xml | ||
end | ||
|
||
def coefficient_values | ||
@xml.xpath(COEFFICIENTS_VALUES_PATH).map{|attribute| attribute.value.to_f} | ||
end | ||
|
||
def coefficient_labels | ||
@xml.xpath(COEFFICIENTS_LABELS_PATH).map(&:value) | ||
end | ||
|
||
def coefficients | ||
@coefficients ||= Hash[coefficient_labels.zip(coefficient_values)] | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'scoruby/models/logistic_regression/data' | ||
require 'forwardable' | ||
|
||
module Scoruby | ||
module Models | ||
module LogisticRegression | ||
class Model | ||
extend Forwardable | ||
def_delegators :@data, :coefficients, :coefficient_values | ||
|
||
def initialize(xml) | ||
@data = Data.new(xml) | ||
end | ||
|
||
def intercept | ||
coefficient_values.first | ||
end | ||
|
||
def score(features) | ||
logodds = intercept | ||
features.each do |key, value| | ||
logodds += coefficients[key] * value | ||
end | ||
|
||
1.0 / (1.0 + Math.exp(-logodds)) | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!--(Comment generated by ADAPA) PMML processed by ADAPA (Version : 4.3)--> | ||
<PMML version="4.3" xmlns="http://www.dmg.org/PMML-4_3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dmg.org/PMML-4_3 http://www.dmg.org/pmml/v4-3/pmml-4-3.xsd"> | ||
<Header copyright="Copyright (c) 2019 baileyjoseph" description="Generalized Linear Regression Model"> | ||
<Extension name="user" value="baileyjoseph" extender="SoftwareAG PMML Generator"/> | ||
<Application name="SoftwareAG PMML Generator" version="1.4"/> | ||
<Timestamp>2019-08-07 16:16:51</Timestamp> | ||
</Header> | ||
<DataDictionary numberOfFields="3"> | ||
<DataField name="value" optype="continuous" dataType="double"/> | ||
<DataField name="prob" optype="continuous" dataType="double"/> | ||
<DataField name="noise_var" optype="continuous" dataType="double"/> | ||
</DataDictionary> | ||
<GeneralRegressionModel modelName="General_Regression_Model" modelType="generalizedLinear" functionName="regression" algorithmName="glm" distribution="binomial" linkFunction="logit"> | ||
<MiningSchema> | ||
<MiningField name="value" usageType="predicted" invalidValueTreatment="returnInvalid"/> | ||
<MiningField name="prob" usageType="active" invalidValueTreatment="returnInvalid"/> | ||
<MiningField name="noise_var" usageType="active" invalidValueTreatment="returnInvalid"/> | ||
</MiningSchema> | ||
<Output> | ||
<OutputField name="Predicted_value" feature="predictedValue" optype="continuous" dataType="double"/> | ||
</Output> | ||
<ParameterList> | ||
<Parameter name="p0" label="(Intercept)"/> | ||
<Parameter name="p1" label="prob"/> | ||
<Parameter name="p2" label="noise_var"/> | ||
</ParameterList> | ||
<FactorList/> | ||
<CovariateList> | ||
<Predictor name="prob"/> | ||
<Predictor name="noise_var"/> | ||
</CovariateList> | ||
<PPMatrix> | ||
<PPCell value="1" predictorName="prob" parameterName="p1"/> | ||
<PPCell value="1" predictorName="noise_var" parameterName="p2"/> | ||
</PPMatrix> | ||
<ParamMatrix> | ||
<PCell parameterName="p0" df="1" beta="-2.88882584455418"/> | ||
<PCell parameterName="p1" df="1" beta="6.08116002712647"/> | ||
<PCell parameterName="p2" df="1" beta="-0.622996648302913"/> | ||
</ParamMatrix> | ||
</GeneralRegressionModel> | ||
</PMML> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
|
||
describe Scoruby::Models::LogisticRegression::Data do | ||
let(:xml) { Scoruby.xml_from_file_path(logistic_regression_file) } | ||
let(:logistic_regression_file) { 'spec/fixtures/logistic_regression.pmml' } | ||
let(:data) { described_class.new(xml) } | ||
|
||
# it 'loads correct number of trees' do | ||
# expect(data.decision_trees.count).to eq 15 | ||
# end | ||
# | ||
it 'loads correct number of coefficient values' do | ||
expect(data.coefficient_values.count).to eq 3 | ||
end | ||
|
||
it 'loads correct number of coefficient labels' do | ||
expect(data.coefficient_labels.count).to eq 3 | ||
end | ||
|
||
it 'loads correct number of coefficients' do | ||
puts data.coefficients | ||
expect(data.coefficients.count).to eq 3 | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
|
||
describe Scoruby::Models::LogisticRegression::Model do | ||
let(:logistic_regression_file) { 'spec/fixtures/logistic_regression.pmml' } | ||
let(:xml) { Scoruby.xml_from_file_path(logistic_regression_file) } | ||
let(:logistic_regression) { described_class.new(xml) } | ||
let(:features) do | ||
{ | ||
'prob' => 0.13, | ||
'noise_var' => 0.5 | ||
} | ||
end | ||
|
||
context 'default' do | ||
it 'scores features' do | ||
expect(logistic_regression.score(features).round(8)).to eq 0.08243046 | ||
end | ||
end | ||
end |