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)
正如@Justas所提到的,如果您想找到输出变量为最大/最小的输入值的最佳组合,那么这是一个优化问题。
scipy中有很多可用的非线性优化器,或者您可以使用元启发式算法,例如遗传算法、模因算法等。
另一方面,如果您的目标是学习反函数,它将输出变量映射到一组输入变量,那么请选择MultiOuputRegresssor或MultiOutputClassifier。它们都可以用作任何基本估计器之上的包装器,例如线性回归、逻辑回归、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)
在大多数情况下,找到输入变量值之一可以帮助预测其他变量。这种方法可以通过ClassifierChain或RegressorChain来实现。
要了解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)