我目前有一个功能 run_prob ,它接受我的模型并返回y_prob。它完美地运作。但是,下面,我将另外两个函数 pred_prob 和 cal_prob 放在一起,我想要这两个函数共同努力将我的 pred_prob,count,true_prob 打印到新的数据框中。
我知道 def pred_prob _ 和 def cal_prob _ 不起作用。但是,功能之间的代码是可操作的。
我遇到的问题是我不知道如何设置run_prob_cv来传递我内置的其他模型(见下文)。
def run_prob_cv(X, y, clf_class, **kwargs):
kf = KFold(len(y), n_folds=5, shuffle=True)
y_prob = np.zeros((len(y),2))
for train_index, test_index in kf:
X_train, X_test = X[train_index], X[test_index]
y_train = y[train_index]
clf = clf_class(**kwargs)
clf.fit(X_train,y_train)
# Predict probabilities, not classes
y_prob[test_index] = clf.predict_proba(X_test)
return y_prob
我建立的模型及其名称为:KNN,SVM,RF和GNB
我在想这些函数会像这样:
def pred_prob_(y_prob, run_prob_cv(X, y, MODEL, n_estimators, **kwargs):
# Use 10 estimators so predictions are all multiples of 0.1
pred_prob = run_prob_cv(X, y, MODEL, n_estimators=10)
pred_churn = pred_prob[:,1]
is_churn = y == 1
# Number of times a predicted probability is assigned to an observation
counts = pd.value_counts(pred_churn)
return counts
def cal_prob_(counts):
# calculate true probabilities
true_prob = {}
for prob in counts.index:
true_prob[prob] = np.mean(is_churn[pred_churn == prob])
true_prob = pd.Series(true_prob)
# pandas-fu
counts = pd.concat([counts,true_prob], axis=1).reset_index()
counts.columns = ['pred_prob', 'count', 'true_prob']
#counts
counts.sort_index(by=['pred_prob','true_prob'], ascending=[False, True])
最终目标是能够使用我的四个模型并像这样运行它们而不必生成重复的代码:
pred_prob_(y_prob, run_prob_cv(X, y, KNN, n_estimators, **kwargs)
pred_prob_(y_prob, run_prob_cv(X, y, RF, n_estimators, **kwargs)
pred_prob_(y_prob, run_prob_cv(X, y, SVM, n_estimators, **kwargs)
pred_prob_(y_prob, run_prob_cv(X, y, GNB, n_estimators, **kwargs)
答案 0 :(得分:0)
def pred_prob(X, y, MODEL):
pred_prob = run_prob_cv(X, y, MODEL)
pred_churn = pred_prob[:,1]
is_churn = y == 1
# Number of times a predicted probability is assigned to an observation
counts = pd.value_counts(pred_churn)
# calculate true probabilities
true_prob = {}
for prob in counts.index:
true_prob[prob] = np.mean(is_churn[pred_churn == prob])
true_prob = pd.Series(true_prob)
# pandas-fu
counts = pd.concat([counts,true_prob], axis=1).reset_index()
counts.columns = ['pred_prob', 'count', 'true_prob']
#counts
print counts.sort_index(by=['pred_prob','true_prob'], ascending=[False, True])
pred_prob(X, y, KNN)
pred_prob(X, y, RF)
pred_prob(X, y, GNB)
pred_prob(X, y, SVC)
答案 1 :(得分:0)
**kwargs
语法用于收集零个或多个命名参数并将其作为dict
进行管理。同样,*posargs
语法对未命名的位置参数执行相同的操作,使其在函数中可用作tuple
。
例如,您可以调用这样的函数:
foo(1, 2, 3, namedparam1=4, namedparam2=5)
如果您愿意,可以显式接收命名参数:
def foo(x, y, z, namedparam1, namedparam2):
或者你可以将它们放在一起"使用**
:
def foo(x, y, z, **kwargs):
在这种情况下,您可以检查,编辑或修改生成的字典:
if 'zanzibar' not in kwargs:
kwargs['zanzibar'] = (-6.167904, 39.228628)
您还可以使用完全相同的 **
语法将dict作为命名参数传递给另一个函数:
bar(z, y, x, **kwargs)
如果bar
已明确命名与kwargs
中的键匹配的参数,则它们将在dict中接收值。如果bar
没有与dict中的键匹配的命名参数,那么如果bar
有一个**
catch-all字典,那么值将会去那里,否则将抛出异常。
例如:
def bar(z, y, x, zanzibar, **kwargs):
在此示例中,zanzibar
现在是必需参数。你可以通过** kwargs传递它,也可以在你的通话中拼写出来,但必须以某种方式存在。 ** kwargs中的其他命名参数仍然是可选的。