常用的解决方法是独热编码( One-Hot 编码)。 它可以有效增加额外的列, 让 0 和 1 出现在对应的列分别表示每个分类值有或无。
pd.get_dummies()
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
参数说明:
实例解释:
在这里插入代码片
可以用于处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等。
DictVectorizer对非数字化的处理方式是,借助原特征的名称,组合成新的特征,并采用0/1的方式进行量化,而数值型的特征转化比较方便,一般情况维持原值即可。
from sklearn.feature_extraction import DictVectorizer
data = [{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
{'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
{'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
{'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}]
vec = DictVectorizer(sparse=False, dtype=int) # sparse=False意思是不产生稀疏矩阵
a = vec.fit_transform(data)
print(vec.get_feature_names()) # 查看转换后的列名
out:
['neighborhood=Fremont', 'neighborhood=Queen Anne', 'neighborhood=Wallingford', 'price', 'rooms']
如果分类特征有许多枚举值, 那么数据集的维度就会急剧增加。因此用稀疏矩阵表示会非常高效,这时可以sparse=True
Scikit-Learn 的许多评估器都支持稀疏矩阵输入。
处理数值型字段。
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder(n_values=’auto’, categorical_features=’all’,dtype=<type ‘numpy.float64’>, sparse=True,handle_unknown=’error’)
参数说明:
PS:具体参数名称随着版本升级有所改变。
实例解释:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
a = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc = OneHotEncoder(dtype=int)
data = enc.fit_transform(a).toarray()
print(data)
out:
[[1 0 1 0 0 0 0 0 1]
[0 1 0 1 0 1 0 0 0]
[1 0 0 0 1 0 1 0 0]
[0 1 1 0 0 0 0 1 0]]
以[0, 0, 3]为例,第一个维度有2种(分别为0和1),因此前输出的前两个 [1 0] 表示0,第二个维度有3(1 0 0 表示0),第三个维度有4(0 0 0 1 表示3)。
此类将符号特性名称(字符串)的序列转换为scipy.sparse矩阵,使用哈希函数计算与名称对应的矩阵列。
是DictVectorizer和CountVectorizer的低内存替代品,用于大规模(在线)学习和内存紧张的情况,例如在嵌入式设备上运行预测代码时。
from sklearn.feature_extraction import FeatureHasher
FeatureHasher(n_features=1048576, input_type="dict", dtype=<class 'numpy.float64'>, alternate_sign=True, non_negative=False)
Pipeline可以将许多算法模型串联起来,可以用于把多个estamitors级联成一个estamitor,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。
PS: pineline中除了最后一个之外的所有的estimators都必须是变换器(transformers)(也就是说必须要有一个transform方法)。最后一个estimator可以是任意的类型(transformer, classifier, regresser, etc)。
(1)通过steps参数,设定数据处理流程。
格式为(‘key’,‘value’),其中key是一个标识步骤的名称字符串,是自己为这一step设定的名称,value是对应的estimator对象。最后通过list将这些step传入。前n-1个step中的类都必须有transform函数,最后一步可有可无,一般最后一步为模型。
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA # 主成分分析
estimators = [('reduce_dim', PCA()), ('clf', SVC()) ]
pipe = Pipeline(estimators)
pipe.fit(X, y)
训练得到的是一个模型,可直接用来预测,预测时,数据会从step1开始进行转换,避免了模型用来预测的数据还要额外写代码实现。还可通过pipe.score(X,Y)得到这个模型在X训练集上的正确率。
(2)通过make_pipeline函数实现
它是Pipeline类的简单实现,只需传入每个step的类实例即可,不需自己命名,自动将类的小写设为该step的名。
from sklearn.linear_model import Lasso
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import RobustScaler #用来解决离群点
p=make_pipeline(RobustScaler(), Lasso(alpha =0.0005, random_state=1))