『Sklearn』特征向量化处理

『Kaggle』分类任务_决策树&集成模型&DataFrame向量化操作

1
2
3
4
5
6
7
8
9
'''特征提取器'''
from sklearn.feature_extraction import DictVectorizer
 
vec = DictVectorizer(sparse = False )
print (X_train.to_dict(orient = 'record' ))
X_train = vec.fit_transform(X_train.to_dict(orient = 'record' ))
print (X_train)
print (vec.feature_names_)
X_test = vec.transform(X_test.to_dict(orient = 'record' ))

  

涉及两个操作,

  • DataFrame字典化
  • 字典向量化

1.DataFrame字典化

1
2
3
4
5
6
7
8
9
10
import numpy as np
import pandas as pd
 
index = [ 'x' , 'y' ]
columns = [ 'a' , 'b' , 'c' ]
 
dtype = [( 'a' , 'int32' ), ( 'b' , 'float32' ), ( 'c' , 'float32' )]
values = np.zeros( 2 , dtype = dtype)
df = pd.DataFrame(values, index = index)
df.to_dict(orient = 'record' )

2.字典向量化

DictVectorizer: 将dict类型的list数据,转换成numpy array,具有属性vec.feature_names_,查看提取后的特征名。

具体效果如下,

>>> from sklearn.feature_extraction import DictVectorizer
>>> v = DictVectorizer(sparse=False) >>> D = [{'foo': 1, 'bar': 2}, {'foo': 3, 'baz': 1}] >>> X = v.fit_transform(D) >>> X array([[ 2., 0., 1.],  [ 0., 1., 3.]]) >>> v.transform({'foo': 4, 'unseen_feature': 3}) array([[ 0., 0., 4.]])

数字的特征不变,没有该特征的项给赋0,对于未参与训练的特征不予考虑。

 

对应到本程序,

print(X_train.to_dict(orient='record')):

[{'sex': 'male', 'pclass': '3rd', 'age': 31.19418104265403},

                         ...... ....... ....... ......

 {'sex': 'female', 'pclass': '1st', 'age': 31.19418104265403}]

提取特征,

X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print(X_train):

[[ 31.19418104 0. 0. 1. 0. 1. ]
[ 31.19418104 1. 0. 0. 1. 0. ]
[ 31.19418104 0. 0. 1. 0. 1. ]
...,
[ 12. 0. 1. 0. 1. 0. ]
[ 18. 0. 1. 0. 0. 1. ]
[ 31.19418104 0. 0. 1. 1. 0. ]]

数字的年龄没有改变,其他obj特征变成了onehot编码的特征,各列意义可以查看的,

print(vec.feature_names_):

['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']

 

一个直观例子:

v = DictVectorizer(sparse=False)
v.fit_transform([{'a':1},{'a':2},{'a':3}])
Out[7]:
array([[ 1.],
       [ 2.],
       [ 3.]])
v.feature_names_
Out[8]:
['a']
v.fit_transform([{'a':'1'},{'a':'2'},{'a':'3'}])
Out[9]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
v.feature_names_
Out[10]:
['a=1', 'a=2', 'a=3']

 注意,v.feature_names_输出顺序和v.fit_transform()生成顺序是一一对应的,

v.fit_transform([{'a':'2q'},{'a':'1v'},{'a':'3t'},{'a':'3t'}])
Out[17]:
array([[ 0.,  1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  1.]])
v.feature_names_
Out[18]:
['a=1v', 'a=2q', 'a=3t']

然后,

np.argmax(np.array([[ 0.,  1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  1.]]),axis=1)
Out[19]:
array([1, 0, 2, 2])

进一步的,也就是说v.feature_names_输出顺序对应于v.fit_transform()的非onehot排序。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sklearn是一个广泛使用的Python机器学习库,其中包含了支持向量机(SVM)模块。在sklearn.svm模块中,有几个类可以用于支持向量机分类算法,包括SVC、NuSVC和LinearSVC。NuSVC类是sklearn中线性分类支持向量机的具体实现,你可以在官方文档中详细了解它的用法和参数设置。 支持向量机是一种常用的模式识别算法,在人像识别、文本分类、手写识别、生物信息识别等领域都得到了广泛应用。它的基本原理是通过构建一个超平面来对数据进行分类,使得距离超平面最近的样本点(即支持向量)离超平面的距离最大。 有了sklearn中的支持向量机模块,你可以使用这些算法来处理分类问题。具体使用哪个类取决于你的数据和问题的需求。比如,如果你的数据是线性可分的,你可以使用LinearSVC类进行分类。如果你的数据是非线性的,你可以考虑使用SVC或者NuSVC类,这两个类支持核函数来处理非线性问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python数模笔记-Sklearn(5)支持向量机](https://blog.csdn.net/youcans/article/details/116885068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值