具有交叉验证的 ngrams 文本模型
ngrams text model with cross validation
在 ngram 模型(字符 ngram 或词袋)中,我们需要确保测试数据的词汇不用于拟合或训练模型。
这就是 sklearn TfidfVectorizer 函数对两个函数(拟合和变换)所做的事情。
所以,如果我有一个 sklearn 管道模型:
model = Pipeline([
('tfidf', TfidfVectorizer()),
('svc', SVC())
])
然后我将它传递给交叉验证函数:
cv = cross_val_score(model, data['text'], data['label'], cv=5, scoring='accuracy', n_jobs=-1)
cross_val_score 是否在每个折叠中都遵循场景(适合训练.. 然后,在测试中转换)?
还是一开始只适合模型一次(第一次折叠)?
是的,每个 cv 步骤的流水线都是 运行,因此对于 cv 的每个步骤,tfidf 拟合仅针对训练折叠和转换进行测试和测试折叠
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
class Estimator(BaseEstimator):
def fit(self,x,y=None):
print ("inside fit:",x)
return self
def transform(self, x):
print ("inside transform", x)
return x
def score(self,x,y):
return 1
model = Pipeline([("e", Estimator()), ('l', linear_model.Lasso())])
cross_val_score(model, np.arange(15).reshape(3,5), np.arange(3), cv=3)
在 ngram 模型(字符 ngram 或词袋)中,我们需要确保测试数据的词汇不用于拟合或训练模型。
这就是 sklearn TfidfVectorizer 函数对两个函数(拟合和变换)所做的事情。
所以,如果我有一个 sklearn 管道模型:
model = Pipeline([
('tfidf', TfidfVectorizer()),
('svc', SVC())
])
然后我将它传递给交叉验证函数:
cv = cross_val_score(model, data['text'], data['label'], cv=5, scoring='accuracy', n_jobs=-1)
cross_val_score 是否在每个折叠中都遵循场景(适合训练.. 然后,在测试中转换)?
还是一开始只适合模型一次(第一次折叠)?
是的,每个 cv 步骤的流水线都是 运行,因此对于 cv 的每个步骤,tfidf 拟合仅针对训练折叠和转换进行测试和测试折叠
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
class Estimator(BaseEstimator):
def fit(self,x,y=None):
print ("inside fit:",x)
return self
def transform(self, x):
print ("inside transform", x)
return x
def score(self,x,y):
return 1
model = Pipeline([("e", Estimator()), ('l', linear_model.Lasso())])
cross_val_score(model, np.arange(15).reshape(3,5), np.arange(3), cv=3)