stochasticLinearRegression
導入バージョン: v20.1.0
この関数は、確率的線形回帰を実装します。 次の項目について、カスタムパラメータをサポートしています。
- 学習率
- L2 正則化係数
- ミニバッチサイズ
また、重みを更新するための手法もいくつか用意されています。
- Adam (デフォルト)
- 単純な SGD
- Momentum
- Nesterov
使用方法
この関数の使用は、モデルの学習と新しいデータに対する予測の 2 段階で行います。
- 学習
学習には、次のようなクエリを使用できます。
CREATE TABLE IF NOT EXISTS train_data
(
target Float64,
x1 Float64,
x2 Float64
) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);
DROP TABLE IF EXISTS your_model;
CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;ここでは、train_data テーブルにもデータを挿入する必要があります。
パラメータの数は固定ではなく、linearRegressionState に渡す引数の数によってのみ決まります。
これらはすべて数値でなければなりません。
予測するよう学習させたい目的変数を持つカラムは、最初の引数として挿入されることに注意してください。
- 予測
状態をテーブルに保存した後は、それを予測に何度も使用したり、他の状態とマージして、さらに優れた新しいモデルを作成したりできます。
CREATE TABLE IF NOT EXISTS test_data
(
x1 Float64,
x2 Float64
) ENGINE = Memory;
INSERT INTO test_data VALUES (10, 0), (20, 0);
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_dataこのクエリは、予測値のカラムを返します。
evalMLMethod の最初の引数は AggregateFunctionState オブジェクトで、その後に特徴量のカラムが続くことに注意してください。
test_data は train_data と同様のテーブルですが、目的変数を含まない場合があります。
注記
- 2 つのモデルをマージするには、次のようなクエリを作成できます。
SELECT state1 + state2 FROM your_modelsここで、your_models テーブルには両方のモデルが含まれています。
このクエリは新しい AggregateFunctionState オブジェクトを返します。
-Statecombinator を使用しない場合は、モデルを保存しなくても、作成したモデルの重みを必要に応じて取得できます。
SELECT stochasticLinearRegression(0.01)(target, x1, x2)
FROM train_dataこのようなクエリを実行すると、モデルが学習され、その重みが返されます。最初の値はモデルのパラメータに対応する重みで、最後の 1 つはバイアスです。 したがって、上記の例では、このクエリは 3 つの値を持つカラムを返します。
構文
stochasticLinearRegression([learning_rate, l2_regularization_coef, mini_batch_size, method])(target, x1, x2, ...)引数
learning_rate— 勾配降下法のステップを実行する際のステップ幅に対する係数です。学習率が大きすぎると、モデルの重みが無限大になる可能性があります。デフォルトは0.00001です。Float64l2_regularization_coef— 過学習の防止に役立つ可能性がある L2 正則化係数です。デフォルトは0.1です。Float64mini_batch_size— 勾配を計算して合計し、勾配降下法の 1 ステップを実行する要素数を設定します。純粋な確率的勾配降下法では 1 つの要素を使用しますが、小さなバッチ (約 10 要素) を使うと勾配ステップがより安定します。デフォルトは15です。UInt64method— 重みの更新方法です:Adam(デフォルト) 、SGD、Momentum、Nesterov。MomentumとNesterovはやや多くの計算量とメモリを必要としますが、収束速度と確率的勾配法の安定性の面で有用です。const Stringtarget— 予測対象として学習する目的変数です。数値である必要があります。Float*x1, x2, ...— 特徴量の値 (独立変数) です。すべて数値である必要があります。Float*
戻り値
学習済みの線形回帰モデルの重みを返します。先頭の値はモデルのパラメータに対応し、最後の値はバイアスです。予測には evalMLMethod を使用します。Array(Float64)
例
モデルの学習
DROP TABLE IF EXISTS train_data;
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);
DROP TABLE IF EXISTS your_model;
CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;
SELECT count() FROM your_model1予測
DROP TABLE IF EXISTS train_data;
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);
DROP TABLE IF EXISTS your_model;
CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;
DROP TABLE IF EXISTS test_data;
CREATE TABLE test_data (x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO test_data VALUES (10, 0), (20, 0);
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) > 0 FROM test_data1
1モデルの重みを取得
DROP TABLE IF EXISTS train_data;
CREATE TABLE train_data (target Float64, x1 Float64, x2 Float64) ENGINE = Memory;
INSERT INTO train_data VALUES (1, 1, 0), (2, 2, 0), (3, 3, 0), (4, 4, 0), (5, 5, 0), (6, 6, 0);
SELECT length(stochasticLinearRegression(0.01)(target, x1, x2)) FROM train_data3関連項目