GVKun编程网logo

在scikit-learn中估算分类缺失值(sklearn缺失值处理)

25

如果您对在scikit-learn中估算分类缺失值感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在scikit-learn中估算分类缺失值的详细内容,我们还将为您解答skl

如果您对在scikit-learn中估算分类缺失值感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在scikit-learn中估算分类缺失值的详细内容,我们还将为您解答sklearn缺失值处理的相关问题,并且为您提供关于python – 使用scikit-learn(sklearn),如何处理线性回归的缺失数据?、python – 在scikit-learn中保存新数据的特征向量、python – 在Scikit-learn分类器中查找最常用的术语、scikit-learn – 使用变换器(估算器)转换sklearn.pipeline中的目标标签的有价值信息。

本文目录一览:

在scikit-learn中估算分类缺失值(sklearn缺失值处理)

在scikit-learn中估算分类缺失值(sklearn缺失值处理)

我有一些文本类型的列的熊猫数据。这些文本列中包含一些NaN值。我想做的是通过sklearn.preprocessing.Imputer(用最常用的值替换NaN
)来估算那些NaN 。问题在于实施。假设有一个具有30列的Pandas数据框df,其中10列属于分类性质。一旦我运行:

from sklearn.preprocessing import Imputerimp = Imputer(missing_values=''NaN'', strategy=''most_frequent'', axis=0)imp.fit(df)

Python会生成一个error: ''could not convert string to float:''run1'''',其中’run1’是带有分类数据的第一列中的普通(不丢失)值。

任何帮助将非常欢迎

答案1

小编典典

要将平均值用于数字列,将最频繁的值用于非数字列,您可以执行以下操作。您可以进一步区分整数和浮点数。我想用中位数代替整数列可能有意义。

import pandas as pdimport numpy as npfrom sklearn.base import TransformerMixinclass DataFrameImputer(TransformerMixin):    def __init__(self):        """Impute missing values.        Columns of dtype object are imputed with the most frequent value         in column.        Columns of other types are imputed with mean of column.        """    def fit(self, X, y=None):        self.fill = pd.Series([X[c].value_counts().index[0]            if X[c].dtype == np.dtype(''O'') else X[c].mean() for c in X],            index=X.columns)        return self    def transform(self, X, y=None):        return X.fillna(self.fill)data = [    [''a'', 1, 2],    [''b'', 1, 1],    [''b'', 2, 2],    [np.nan, np.nan, np.nan]]X = pd.DataFrame(data)xt = DataFrameImputer().fit_transform(X)print(''before...'')print(X)print(''after...'')print(xt)

哪个打印,

before...     0   1   20    a   1   21    b   1   12    b   2   23  NaN NaN NaNafter...   0         1         20  a  1.000000  2.0000001  b  1.000000  1.0000002  b  2.000000  2.0000003  b  1.333333  1.666667

python – 使用scikit-learn(sklearn),如何处理线性回归的缺失数据?

python – 使用scikit-learn(sklearn),如何处理线性回归的缺失数据?

我尝试了这个,但无法让它适用于我的数据:
Use Scikit Learn to do linear regression on a time series pandas data frame

我的数据包含2个DataFrame. DataFrame_1.shape =(40,5000)和DataFrame_2.shape =(40,74).我正在尝试进行某种类型的线性回归,但DataFrame_2包含NaN缺失的数据值.当我DataFrame_2.dropna(how =“any”)时,形状下降到(2,74).

sklearn中是否存在可以处理NaN值的线性回归算法?

我在sklearn.datasets的load_boston之后对其进行建模,其中X,y = boston.data,boston.target =(506,13),(506,)

这是我的简化代码:

X = DataFrame_1
for col in DataFrame_2.columns:
    y = DataFrame_2[col]
    model = LinearRegression()
    model.fit(X,y)

#ValueError: Input contains NaN,infinity or a value too large for dtype('float64').

我做了上面的格式来获得与矩阵匹配的形状

如果发布DataFrame_2会有所帮助,请在下方发表评论,我会添加它.

最佳答案
您可以使用插补填充y中的空值.在scikit-learn中,使用以下代码片段完成此操作:

from sklearn.preprocessing import Imputer
imputer = Imputer()
y_imputed = imputer.fit_transform(y)

否则,您可能希望使用74列的子集作为预测变量来构建模型,也许您的某些列包含较少的空值?

python – 在scikit-learn中保存新数据的特征向量

python – 在scikit-learn中保存新数据的特征向量

为了创建机器学习算法,我制作了一个词典列表,并使用scikit的DictVectorizer为每个项目制作一个特征向量.然后,我使用部分数据从数据集创建SVM模型进行训练,然后在测试集上测试模型(您知道,这是典型的方法).一切都很好,现在我想将模型部署到野外,看看它是如何工作的新的,未标记的,看不见的数据.如何保存特征向量以使新数据具有相同的大小/特征并与SVM模型一起使用?例如,如果我想训练单词的存在:

[{
 'contains(the)': 'True','contains(cat)': 'True','contains(is)': 'True','contains(hungry)': 'True'
 }...
]

我训练的列表中有相同的句子,有数千种动物变种.当我对列表进行矢量化时,它会考虑所有提到的不同动物,并在每个动物的矢量中创建一个索引(”’,’是’和’饥饿’不会改变).现在,当我尝试在新句子上使用模型时,我想预测一个项目:

[{
 'contains(the)': 'True','contains(emu)': 'True','contains(hungry)': 'True'
 }]

没有原始训练集,当我使用DictVectorizer时,它会生成:(1,1,1).这是用于训练我的模型的原始向量之外的几千个索引,因此SVM模型将无法使用它.或者即使向量的长度是正确的,因为它是在大量句子上训练的,因此这些特征可能与原始值不对应.如何获得新数据以符合训练向量的维度?永远不会有比训练集更多的功能,但并不是所有功能都保证存在于新数据中.

有没有办法使用pickle来保存特征向量?或者我考虑过的一种方法是生成一个字典,其中包含值为’False’的所有可能特征.这会强制新数据进入正确的矢量大小,并仅计算新数据中存在的项目.

我觉得我可能没有充分描述这个问题,所以如果有些事情不清楚,我会尝试更好地解释它.先感谢您!

编辑:感谢larsman的回答,解决方案非常简单:

from sklearn.pipeline import Pipeline
from sklearn import svm
from sklearn.feature_extraction import DictVectorizer

vec = DictVectorizer(sparse=False)
svm_clf = svm.SVC(kernel='linear')
vec_clf = Pipeline([('vectorizer',vec),('svm',svm_clf)])
vec_clf.fit(X_Train,Y_Train)
joblib.dump(vec_clf,'vectorizer_and_SVM.pkl')

管道和支持向量机被训练成数据.现在,所有未来的模型都可以取消管道,并在SVM中内置了一个特征向量器.

解决方法

How do I get new data to conform to the dimensions of the training vectors?

通过使用transform方法而不是fit_transform.后者从您提供的数据集中学习新的词汇表.

Is there a way to use pickle to save the feature vector?

挑选训练有素的矢量化器.更好的是,制作矢量化器的管道和SVM并腌制它.您可以使用sklearn.externals.joblib.dump进行有效的酸洗.

(旁白:如果你传递布尔值True而不是字符串“True”,矢量化器会更快.)

python – 在Scikit-learn分类器中查找最常用的术语

python – 在Scikit-learn分类器中查找最常用的术语

参见英文答案 > List the words in a vocabulary according to occurrence in a text corpus,Scikit-Learn                                    2个
我正在关注 example in Scikit learn docs,其中CountVectorizer用于某些数据集.

问题:count_vect.vocabulary_.viewitems()列出了所有术语及其频率.你如何根据出现次数对它们进行排序?

sorted(count_vect.vocabulary_.viewitems())似乎不起作用.

解决方法

vocabulary_.viewitems()实际上并不列出术语及其频率,而是列出从术语到索引的映射. fit_transform方法返回频率(每个文档),返回稀疏(coo)矩阵,其中行是文档,列是单词(列索引通过词汇表映射到单词).例如,您可以获得总频率

matrix = count_vect.fit_transform(doc_list)
freqs = zip(count_vect.get_feature_names(),matrix.sum(axis=0))    
# sort from largest to smallest
print sorted(freqs,key=lambda x: -x[1])

scikit-learn – 使用变换器(估算器)转换sklearn.pipeline中的目标标签

scikit-learn – 使用变换器(估算器)转换sklearn.pipeline中的目标标签

我知道可以链接几个实现变换方法的估算器来转换sklearn.pipeline中的X(特征集).但是我有一个用例,我想要转换目标标签(比如将标签转换为[1 … K]而不是[0,K-1],我很乐意将其作为我管道中的一个组件是否有可能使用sklearn.pipeline.?
不,管道总是会经过不变的.在管道外进行转换.

(这是scikit-learn中一个已知的设计缺陷,但它从来没有足够的压力来改变或扩展API.)

我们今天的关于在scikit-learn中估算分类缺失值sklearn缺失值处理的分享已经告一段落,感谢您的关注,如果您想了解更多关于python – 使用scikit-learn(sklearn),如何处理线性回归的缺失数据?、python – 在scikit-learn中保存新数据的特征向量、python – 在Scikit-learn分类器中查找最常用的术语、scikit-learn – 使用变换器(估算器)转换sklearn.pipeline中的目标标签的相关信息,请在本站查询。

本文标签: