sklearn 交叉验证中的自定义评分函数
Custom Scoring Function in sklearn Cross Validate
我想为 cross_validate
使用自定义函数,它使用特定的 y_test
来计算精度,这与实际目标 y_test
不同 y_test
.
我已经用 make_scorer
尝试了一些方法,但我不知道如何实际通过我的替代方案 y_test
:
scoring = {'prec1': 'precision',
'custom_prec1': make_scorer(precision_score()}
scores = cross_validate(pipeline, X, y, cv=5,scoring= scoring)
任何人都可以提出一个方法吗?
这样找到的。也许代码不是最优的,抱歉。
好的,让我们开始吧:
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.metrics.scorer import make_scorer
xTrain = np.random.rand(100, 100)
yTrain = np.random.randint(1, 4, (100, 1))
yTrainCV = np.random.randint(1, 4, (100, 1))
model = LogisticRegression()
yTrainCV
将在此处用作自定义得分手。
def customLoss(xArray, yArray):
indices = xArray.index.values
tempArray = [1 if value1 != value2 else 0 for value1, value2 in zip(xArray.values, yTrainCV[[indices]])]
return sum(tempArray)
scorer = {'main': 'accuracy',
'custom': make_scorer(customLoss, greater_is_better=True)}
这里有一些技巧:
- 您需要传递给 customLoss 2 个值(模型预测 + 实际值;不过我们不使用第二个参数)
- 有一些
greater_is_better
的游戏:True
/False
将 return 为正数或负数
- 我们在
GridSearchCV
中从 CV 中获得的指数
还有...
grid = GridSearchCV(model,
scoring=scorer,
cv=5,
param_grid={'C': [1e0, 1e1, 1e2, 1e3],
'class_weight': ['balanced', None]},
refit='custom')
grid.fit(xTrain, pd.DataFrame(yTrain))
print(grid.score(xTrain, pd.DataFrame(yTrain)))
- 不要忘记
GridSearchCV
中的refit
参数
- 我们在这里将目标数组作为
DataFrame
传递——这将帮助我们检测自定义损失函数中的索引
我想为 cross_validate
使用自定义函数,它使用特定的 y_test
来计算精度,这与实际目标 y_test
不同 y_test
.
我已经用 make_scorer
尝试了一些方法,但我不知道如何实际通过我的替代方案 y_test
:
scoring = {'prec1': 'precision',
'custom_prec1': make_scorer(precision_score()}
scores = cross_validate(pipeline, X, y, cv=5,scoring= scoring)
任何人都可以提出一个方法吗?
这样找到的。也许代码不是最优的,抱歉。
好的,让我们开始吧:
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.metrics.scorer import make_scorer
xTrain = np.random.rand(100, 100)
yTrain = np.random.randint(1, 4, (100, 1))
yTrainCV = np.random.randint(1, 4, (100, 1))
model = LogisticRegression()
yTrainCV
将在此处用作自定义得分手。
def customLoss(xArray, yArray):
indices = xArray.index.values
tempArray = [1 if value1 != value2 else 0 for value1, value2 in zip(xArray.values, yTrainCV[[indices]])]
return sum(tempArray)
scorer = {'main': 'accuracy',
'custom': make_scorer(customLoss, greater_is_better=True)}
这里有一些技巧:
- 您需要传递给 customLoss 2 个值(模型预测 + 实际值;不过我们不使用第二个参数)
- 有一些
greater_is_better
的游戏:True
/False
将 return 为正数或负数 - 我们在
GridSearchCV
中从 CV 中获得的指数
还有...
grid = GridSearchCV(model,
scoring=scorer,
cv=5,
param_grid={'C': [1e0, 1e1, 1e2, 1e3],
'class_weight': ['balanced', None]},
refit='custom')
grid.fit(xTrain, pd.DataFrame(yTrain))
print(grid.score(xTrain, pd.DataFrame(yTrain)))
- 不要忘记
GridSearchCV
中的 - 我们在这里将目标数组作为
DataFrame
传递——这将帮助我们检测自定义损失函数中的索引
refit
参数