这些是关于如何计算和减少机器学习过度拟合的问题.我认为许多新的机器学习会有同样的问题,所以我试着清楚我的例子和问题,希望这里的答案可以帮助别人.
我有一个非常小的文本样本,我正在尝试预测与它们相关的值.我已经使用sklearn来计算tf-idf,并将它们插入到回归模型中进行预测.这给了我26个样本,6323个功能 - 不是很多..我知道:
>> count_vectorizer = CountVectorizer(min_n=1, max_n=1)
>> term_freq = count_vectorizer.fit_transform(texts)
>> transformer = TfidfTransformer()
>> X = transformer.fit_transform(term_freq)
>> print X.shape
(26, 6323)
Run Code Online (Sandbox Code Playgroud)
将这些6323个特征(X)和相关分数(y)的26个样本插入到LinearRegression模型中,可以得到很好的预测.这些是使用留一法交叉验证获得的,来自cross_validation.LeaveOneOut(X.shape[0], indices=True):
using ngrams (n=1):
human machine points-off %error
8.67 8.27 0.40 1.98
8.00 7.33 0.67 3.34
... ... ... ...
5.00 6.61 1.61 8.06
9.00 7.50 1.50 7.50
mean: 7.59 7.64 1.29 6.47
std : 1.94 0.56 1.38 6.91
Run Code Online (Sandbox Code Playgroud)
非常好!使用ngrams(n = 300)而不是unigrams(n = 1),会出现类似的结果,这显然是不对的.在任何文本中都不会出现300个单词,因此预测应该会失败,但它不会:
using ngrams (n=300):
human machine …Run Code Online (Sandbox Code Playgroud) 今天我正在尝试学习一些关于K-means的东西.我已经理解了算法,我知道它是如何工作的.现在我正在寻找正确的k ...我发现肘部标准作为检测正确k的方法,但我不明白如何使用它与scikit学习?!在scikit中,我学会了以这种方式聚集事物
kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10)
kmeans.fit(data)
Run Code Online (Sandbox Code Playgroud)
那么我应该多次为n_clusters = 1 ... n这样做并观察错误率以获得正确的k?认为这会很愚蠢,需要花费很多时间?!
python cluster-analysis machine-learning k-means scikit-learn
我有一个pandas数据框,有一些行和列.每列都有一个标题.现在,只要我继续在pandas中进行数据操作操作,我的变量头就会被保留.但是如果我尝试使用Sci-kit-learn lib的一些数据预处理功能,我最终会丢失所有标题,并且帧会转换为数字矩阵.
我理解为什么会发生这种情况,因为scikit-learn给出了一个numpy ndarray作为输出.而numpy ndarray只是矩阵不会有列名.
但事情就是这样.如果我在我的数据集上构建一些模型,即使在初始数据预处理和尝试某些模型之后,我可能还需要做一些更多的数据操作任务来运行其他模型以获得更好的拟合.无法访问列标题使得很难进行数据操作,因为我可能不知道特定变量的索引是什么,但是更容易记住变量名,甚至可以通过执行df.columns来查找.
如何克服这个?
EDIT1:使用示例数据快照进行编辑.
Pclass Sex Age SibSp Parch Fare Embarked
0 3 0 22 1 0 7.2500 1
1 1 1 38 1 0 71.2833 2
2 3 1 26 0 0 7.9250 1
3 1 1 35 1 0 53.1000 1
4 3 0 35 0 0 8.0500 1
5 3 0 NaN 0 0 8.4583 3
6 1 0 54 0 0 51.8625 1
7 3 0 2 3 1 21.0750 1
8 …Run Code Online (Sandbox Code Playgroud) 我正在使用scikit-learn和numpy,我想设置全局种子,以便我的工作可以重现.
我应该使用numpy.random.seed或random.seed?
编辑: 从评论中的链接,我知道它们是不同的,并且numpy版本不是线程安全的.我想知道哪一个用于创建IPython笔记本进行数据分析.scikit-learn中的一些算法涉及生成随机数,我想确保笔记本在每次运行时都显示相同的结果.
我有一个由逻辑回归算法训练的二元预测模型.我想知道哪些特征(预测因子)对于正面或负面类的决定更重要.我知道有一些coef_参数来自scikit-learn包,但我不知道它是否足够重要.另一件事是我如何coef_根据负面和正面类别的重要性来评估价值观.我还读到了标准化的回归系数,我不知道它是什么.
可以说,有一些特征,如肿瘤的大小,肿瘤的重量等,以决定恶性或非恶性的测试案例.我想知道哪些特征对恶性而非恶性预测更重要.它有道理吗?
根据我的理解,scikit-learn接受(n-sample,n-feature)格式的数据,这是一个2D数组.假设我有表格中的数据......
Stock prices indicator1 indicator2
2.0 123 1252
1.0 .. ..
.. . .
.
Run Code Online (Sandbox Code Playgroud)
我该如何导入?
我有一个22 GB的数据集.我想在我的笔记本电脑上处理它.当然我无法将其加载到内存中.
我使用很多sklearn但是对于更小的数据集.
在这种情况下,经典方法应该是这样的.
只读部分数据 - >部分训练您的估算器 - >删除数据 - >读取其他部分数据 - >继续训练您的估算器.
我已经看到一些sklearn算法具有部分拟合方法,应该允许我们使用数据的各种子样本来训练估计器.
现在我想知道为什么在sklearn中这样做很容易?我正在寻找类似的东西
r = read_part_of_data('data.csv')
m = sk.my_model
`for i in range(n):
x = r.read_next_chunk(20 lines)
m.partial_fit(x)
m.predict(new_x)
Run Code Online (Sandbox Code Playgroud)
也许sklearn不是这类东西的正确工具?让我知道.
我有一个包含大约800万条新闻文章的语料库,我需要将它们的TFIDF表示为稀疏矩阵.我已经能够使用scikit-learn来获得相对较少数量的样本,但我相信它不能用于如此庞大的数据集,因为它首先将输入矩阵加载到内存中,这是一个昂贵的过程.
有谁知道,提取大型数据集的TFIDF向量的最佳方法是什么?
我正在学习一个scikit学习的例子(分类比较),并与糊涂了predict_proba和decision_function.
他们通过使用Z = clf.decision_function()或绘制轮廓来绘制分类结果 Z = clf.predict_proba().
这两者有什么不同?是这样每种分类方法都有两个分数?
哪一个更适合解释分类结果,我该如何从两个中进行选择?
你能解释一下scikit-learn中的"适合"方法吗?为什么有用?
我是机器学习和scikit-learn的新手.
scikit-learn ×10
python ×9
numpy ×3
bigdata ×1
k-means ×1
lucene ×1
nlp ×1
pandas ×1
random ×1
random-seed ×1
regression ×1
tf-idf ×1