使用Python使用一个(或多个)参数进行多输出回归或分类

tag*_*aga 7 python machine-learning scikit-learn

我使用Python的Scikit-learn库编写了一个简单的线性回归和决策树分类器代码,用于预测结果。它运作良好。

我的问题是,是否有一种方法可以反向执行此操作,以根据估算结果(参数,精度最高的参数)来预测参数值的最佳组合。

或者我可以这样问,是否存在可以基于一个(或多个)预测多个结果的分类,回归或其他某种类型的算法(决策树,SVM,KNN,逻辑回归,线性回归,多项式回归...) )参数?

我试图通过放入多变量结果来做到这一点,但它显示了错误:

ValueError:预期的2D数组,取而代之的是1D数组:array = [101905182182268646624465]。如果数据具有单个功能,则使用array.reshape(-1,1)重整数据;如果包含单个样本,则使用array.reshape(1,-1)重整数据。

这是我为回归编写的代码:

import pandas as pd
from sklearn import linear_model
from sklearn import tree

dic = {'par_1': [10, 30, 13, 19, 25, 33, 23],
       'par_2': [1, 3, 1, 2, 3, 3, 2],
       'outcome': [101, 905, 182, 268, 646, 624, 465]}

df = pd.DataFrame(dic)

variables = df.iloc[:,:-1]
results = df.iloc[:,-1]

regression = linear_model.LinearRegression()
regression.fit(variables, results)

input_values = [14, 2]

prediction = regression.predict([input_values])
prediction = round(prediction[0], 2)
print(prediction)
Run Code Online (Sandbox Code Playgroud)

这是我为决策树编写的代码:

dic = {'par_1': [10, 30, 13, 19, 25, 33, 23],
       'par_2': [1, 3, 1, 2, 3, 3, 2],
       'outcome': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'yes']}

df = pd.DataFrame(dic)

variables = df.iloc[:,:-1]
results = df.iloc[:,-1]

decision_tree = tree.DecisionTreeClassifier()
decision_tree.fit(variables, results)

input_values = [18, 2]

prediction = decision_tree.predict([input_values])[0]
print(prediction)
Run Code Online (Sandbox Code Playgroud)

Ven*_*lam 3

正如@Justas所提到的,如果您想找到输出变量为最大/最小的输入值的最佳组合,那么这是一个优化问题。

scipy中有很多可用的非线性优化器,或者您可以使用元启发式算法,例如遗传算法、模因算法等。

另一方面,如果您的目标是学习反函数,它将输出变量映射到一组输入变量,那么请选择MultiOuputRegresssorMultiOutputClassifier。它们都可以用作任何基本估计器之上的包装器,例如线性回归、逻辑回归、KNN、决策树、SVM 等。

例子:

import pandas as pd
from sklearn.multioutput import MultiOutputRegressor, RegressorChain
from sklearn.linear_model import LinearRegression


dic = {'par_1': [10, 30, 13, 19, 25, 33, 23],
       'par_2': [1, 3, 1, 2, 3, 3, 2],
       'outcome': [101, 905, 182, 268, 646, 624, 465]}

df = pd.DataFrame(dic)

variables = df.iloc[:,:-1]
results = df.iloc[:,-1]

multi_output_reg = MultiOutputRegressor(LinearRegression())
multi_output_reg.fit(results.values.reshape(-1, 1),variables)

multi_output_reg.predict([[100]])

# array([[12.43124217,  1.12571947]])
# sounds sensible according to the training data

#if input variables needs to be treated as categories,
# go for multiOutputClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression

multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs'))
multi_output_clf.fit(results.values.reshape(-1, 1),variables)

multi_output_clf.predict([[100]])

# array([[10,  1]])
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,找到输入变量值之一可以帮助预测其他变量。这种方法可以通过ClassifierChainRegressorChain来实现。

要了解ClassifierChain的优势,请参考示例。

更新:


dic = {'par_1': [10, 30, 13, 19, 25, 33, 23],
       'par_2': [1, 3, 1, 2, 3, 3, 2],
       'outcome': [0, 1, 1, 1, 1, 1 , 0]}

df = pd.DataFrame(dic)

variables = df.iloc[:,:-1]
results = df.iloc[:,-1]

multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs',
                                                            multi_class='ovr'))
multi_output_clf.fit(results.values.reshape(-1, 1),variables)

multi_output_clf.predict([[1]])
# array([[13,  3]])

Run Code Online (Sandbox Code Playgroud)