给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归
Posted
技术标签:
【中文标题】给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归【英文标题】:Scikit-learn regression on two variables given a 2D matrix of reference values 【发布时间】:2021-11-21 18:27:48 【问题描述】:我有一个参考值矩阵,想了解如何使用 Scikit-learn 为其生成回归模型。我过去做过几种类型的单变量回归,但我不清楚如何在 sklearn 中使用两个变量。
我有两个特征(A 和 B)和一个用于某些输入 A/B 值的输出值表。请参见下面的表格和 3D 表面。我想看看如何将其转换为将 A/B 输入与单值输出相关联的两个变量方程,如表中所示。这种关系看起来是非线性的,它也可能是二次的、对数的等等......
如何使用 sklearn 对此表格数据执行非线性回归?
A/B 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000
0 8.78 8.21 7.64 7.07 6.50 5.92 5.35 4.78 4.21 3.63 3.06
5 8.06 7.56 7.07 6.58 6.08 5.59 5.10 4.60 4.11 3.62 3.12
10 7.33 6.91 6.50 6.09 5.67 5.26 4.84 4.43 4.01 3.60 3.19
15 6.60 6.27 5.93 5.59 5.26 4.92 4.59 4.25 3.92 3.58 3.25
20 5.87 5.62 5.36 5.10 4.85 4.59 4.33 4.08 3.82 3.57 3.31
25 5.14 4.97 4.79 4.61 4.44 4.26 4.08 3.90 3.73 3.55 3.37
30 4.42 4.32 4.22 4.12 4.02 3.93 3.83 3.73 3.63 3.53 3.43
35 3.80 3.78 3.75 3.72 3.70 3.67 3.64 3.62 3.59 3.56 3.54
40 2.86 2.93 2.99 3.05 3.12 3.18 3.24 3.31 3.37 3.43 3.50
45 2.08 2.24 2.39 2.54 2.70 2.85 3.00 3.16 3.31 3.46 3.62
50 1.64 1.84 2.05 2.26 2.46 2.67 2.88 3.08 3.29 3.50 3.70
55 1.55 1.77 1.98 2.19 2.41 2.62 2.83 3.05 3.26 3.47 3.69
60 2.09 2.22 2.35 2.48 2.61 2.74 2.87 3.00 3.13 3.26 3.39
65 3.12 3.08 3.05 3.02 2.98 2.95 2.92 2.88 2.85 2.82 2.78
70 3.50 3.39 3.28 3.17 3.06 2.95 2.84 2.73 2.62 2.51 2.40
75 3.42 3.32 3.21 3.10 3.00 2.89 2.78 2.68 2.57 2.46 2.36
80 3.68 3.55 3.43 3.31 3.18 3.06 2.94 2.81 2.69 2.57 2.44
85 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
90 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
95 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
100 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
【问题讨论】:
你的问题对我来说毫无意义。您有两个自变量 A 和 B,以及一个我称之为 Z 的因变量。如果是 3D 图,您将有 Z = f(A, B)。我可以看到您如何将其视为一系列一维图,其中您保持 A 或 B 不变并适合另一个。这是你要求的吗? 是的,它在 3d 图上绘制为平面,该图可以用一个方程来描述吗?我已将图像添加到顶帖。谢谢。 你有什么尝试解决这个问题的? “不知道如何解决这个问题”是什么意思?您是否尝试过学习如何做到这一点? 显示您的代码,即使是部分问题/解决方案/错误/等,将大大吸引其他人考虑您的问题。 您可以使用包含交互项的高阶多项式进行线性回归。那应该很简单。你为什么不试试看呢? f(x, y) = sum(cij(x^i)(y^j) for i,j = 0 to 5 应该很容易做到。 【参考方案1】:您的 A
、B
和表值之间可能存在简洁的非线性关系,但在没有对该系统的一些了解或任何复杂的非线性建模的情况下,这里有一个 荒谬 模型一个体面的score
。
the_table = """1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000
0 8.78 8.21 7.64 7.07 6.50 5.92 5.35 4.78 4.21 3.63 3.06
5 8.06 7.56 7.07 6.58 6.08 5.59 5.10 4.60 4.11 3.62 3.12
10 7.33 6.91 6.50 6.09 5.67 5.26 4.84 4.43 4.01 3.60 3.19
15 6.60 6.27 5.93 5.59 5.26 4.92 4.59 4.25 3.92 3.58 3.25
20 5.87 5.62 5.36 5.10 4.85 4.59 4.33 4.08 3.82 3.57 3.31
25 5.14 4.97 4.79 4.61 4.44 4.26 4.08 3.90 3.73 3.55 3.37
30 4.42 4.32 4.22 4.12 4.02 3.93 3.83 3.73 3.63 3.53 3.43
35 3.80 3.78 3.75 3.72 3.70 3.67 3.64 3.62 3.59 3.56 3.54
40 2.86 2.93 2.99 3.05 3.12 3.18 3.24 3.31 3.37 3.43 3.50
45 2.08 2.24 2.39 2.54 2.70 2.85 3.00 3.16 3.31 3.46 3.62
50 1.64 1.84 2.05 2.26 2.46 2.67 2.88 3.08 3.29 3.50 3.70
55 1.55 1.77 1.98 2.19 2.41 2.62 2.83 3.05 3.26 3.47 3.69
60 2.09 2.22 2.35 2.48 2.61 2.74 2.87 3.00 3.13 3.26 3.39
65 3.12 3.08 3.05 3.02 2.98 2.95 2.92 2.88 2.85 2.82 2.78
70 3.50 3.39 3.28 3.17 3.06 2.95 2.84 2.73 2.62 2.51 2.40
75 3.42 3.32 3.21 3.10 3.00 2.89 2.78 2.68 2.57 2.46 2.36
80 3.68 3.55 3.43 3.31 3.18 3.06 2.94 2.81 2.69 2.57 2.44
85 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
90 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
95 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69
100 3.43 3.35 3.28 3.21 3.13 3.06 2.99 2.91 2.84 2.77 2.69"""
import numpy as np
import pandas as pd
import io
df = pd.read_csv(io.StringIO(initial_value=the_table), sep="\s+")
df.columns = df.columns.astype(np.uint64)
df_unstacked = df.unstack()
X = df_unstacked.index.tolist()
y = df_unstacked.to_list()
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(6)
poly_X = poly.fit_transform(X)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(poly_X,y)
print(model.score(poly_X,y))
# 0.9762180339233807
要使用此模型给定 A
和 B
的 predict
值,您需要像创建模型一样转换输入。比如,
model.predict(poly.transform([(1534,56)]))
# array([2.75275659])
更荒谬得离谱 ...
more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in X]
poly = PolynomialFeatures(5)
poly_X = poly.fit_transform(more_X)
model.fit(poly_X,y)
print(model.score(poly_X,y))
# 0.9982994398684035
... 和predict
:
more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in [(1534,56)]]
model.predict(poly.transform(more_X))
# array([2.74577017])
注:可能有更好的方法来以 Python 方式 对这些荒谬的模型进行编程。
【讨论】:
我如何才能对这个模型进行预测?我试过 model.predict((1534,56)) 它要求我运行 .reshape 但然后告诉我元组没有名为“reshape”的属性 @ortunoa 输入需要像模型一样进行转换。例如,对于第一个模型:model.predict(poly.transform([(1534,56)]))
-> array([2.75275659])
。
@ortunoa ... 对于第二个模型:more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in [(1534,56)]];model.predict(poly.transform(more_X))
-> array([2.74577017])
。
@ortunoa 如果您要进行疯狂(或不疯狂)的输入转换,最好使用sklearn Pipelines 组织它们。以上是关于给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归的主要内容,如果未能解决你的问题,请参考以下文章