sklearn中的特征处理

特征提取

字典特征提取

from sklearn.feature_extraction import DictVectorizer
# 字典特征处理的 sklearn API
def dictvec():
    # 实例化对象 sparse = True 代表返回sparse 矩阵
    dict = DictVectorizer(sparse=True)
    # 传入参数必须是字典或者带有字典的可迭代对象 注意sparse为true时调用toarray方法将转为与sparse为false相同
    data = dict.fit_transform([{
     'city':'北京' , 'temperatyre':100},
                     {
     'city':'上海' , 'temperatyre':60},
                     {
     'city':'深圳' , 'temperatyre':20}]).toarray()
    # 这里打出原列表
    print(dict.inverse_transform(data))
    print(data)
    # data返回值
    # (0, 1)  1.0
    # (0, 3) 100.0
    # (1, 0) 1.0
    # (1, 3) 60.0
    # (2, 2) 1.0
    # (2, 3) 20.0
    # 当设置sparse为false时
    dict1 = DictVectorizer(sparse=False)
    data2 = dict1.fit_transform(dict.inverse_transform(data))
    print(data2)
    print(dict1.transform([{
     'city':'北京' , 'temperatyre':100},
                     {
     'city':'上海' , 'temperatyre':60},
                     {
     'city':'深圳' , 'temperatyre':20}]))
    # data2的值
    # [[0.   1.   0. 100.]
    #  [1.   0.   0.  60.]
    # [0.    0.   1.  20.]]
    # 前三行是one-hot编码  对key
    return None

处理字典数据特征:就是保留数值型数据,对字符串类型数据进行one- hot编码处理

文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
import jieba
# 处理中文字符串的包  将中文字符串按照词划分

def textdev():
    # 获取文本特征

    # 实例化对象
    cv = CountVectorizer()
    data = [
        'I like Python and math',
        'I dislike C and C++'
    ]
    # fit_transform 返回soarse矩阵 toarray后变成矩阵
    data_res = cv.fit_transform(data).toarray()
    print(cv.get_feature_names())
    print(data_res)

处理英文字符特征,就是将多个字符串共有的词汇提取出来,然后统计每个字符串中词汇出现的次数

对于中文字符串的处理
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_words():
   a = '今天是个好日子'
   b = '昨天是个好日子'
   c = '希望以后的每天都是好日子'
   # jieba.cut将句子按照词拆开。返回列表,.join方法将列表按照‘ ’划分
   a1 = ' '.join(jieba.cut(a))
   b1 = ' '.join(jieba.cut(b))
   c1 = ' '.join(jieba.cut(c))
   return a1, b1, c1
def deal_chinese(a1, b1, c1):
   # 将划分后的字符串传给cv  就可以来读取中文了
   cv = CountVectorizer()
   data = [a1,b1,c1]
   data_array = cv.fit_transform(data).toarray()
   print(cv.get_feature_names())
   print(data_array)

对于中文的处理就是将一个句子变成一个个词语,然后计算词在每个字符串中出现的次数

tfidf方法统计词频

  • tf: term frequency 词频
  • idf: 逆文档频率 公式: log(总文档数/该词出现的次数)
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def cut_words():
    a = '今天是个好日子'
    b = '昨天是个好日子'
    c = '希望以后的每天都是好日子'
    # jieba.cut将句子按照词拆开。返回列表,.join方法将列表按照‘ ’划分
    a1 = ' '.join(jieba.cut(a))
    b1 = ' '.join(jieba.cut(b))
    c1 = ' '.join(jieba.cut(c))
    return a1, b1, c1
def deal_chinese(a1, b1, c1):
    # 将划分后的字符串传给cv  就可以来读取中文了
    cv = CountVectorizer()
    data = [a1,b1,c1]
    data_array = cv.fit_transform(data).toarray()
    print(cv.get_feature_names())
    print(data_array)
def frequency(a1, b1, c1):
    # 接下来使用tf idf方法统计词频  忽略掉那些出现很多但无关紧要的词汇 
    tf = TfidfVectorizer()
    data = tf.fit_transform([a1, b1, c1]).toarray()
    print(tf.get_feature_names())
    print(data)

tfidf 方法就是忽略掉那些出现次数很多但是相对无关紧要的词语,比如在一篇 讲述机器学习的文章中 忽略掉诸如 “因为”、“我们”等相对无关紧要的词语,保留“算法”、“实验”等高频词汇。

特征处理

数字特征处理

  • 归一化处理
  • 标准化处理

sklearn中的归一化处理API

from sklearn.preprocessing import MinMaxScaler
import numpy as np
x = np.array([[1, 2, 3], [1,2,4], [2,5,6]])

travel = MinMaxScaler(feature_range=(0,2))
# 按照列进行归一化 (x - x(min)) / (x(max) - x(min)) feature_range 可选范围  默认(0-1)
data = travel.fit_transform(x)
print(data)

归一化处理时我们默认处理的特征对结果的影响相同 使得每个特征对最终结果不会造成更大的影响
然而,归一化处理的结果容易受到异常点较大的影响 即鲁棒性较差

sklearn中的标准化处理API

from sklearn.preprocessing import StandardScaler
travel_standard = StandardScaler()
# 这个变换方式是 (x-mean)/(sigma) 避免了因为最值的过大或者过小产生的影响
data_standard = travel_standard.fit_transform(data)
print(data_standard)
# 获取列均值
print(travel_standard.mean_)
# 获取列方差
print(travel_standard.std_)

标准化处理避免了异常点的出现导致的较大数据偏差,适合于数据量较大时的特征处理

缺失值的处理

  • sklearn 处理API
# from sklearn.preprocessing import I
# 这是2.1之前的用法
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# from sklearn.impute import IterativeImputer
# 这个包不稳定,这样导不进去
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
im = IterativeImputer()
data = [[1, 2], [np.nan, 3], [4, 5]]
print(im.fit_transform((data)))

Interative内可传参数 strategy 可选择中位数与众数 默认平均值mean填充

  • pandas 处理缺失值
import pandas as pd
import numpy as np
from numpy import nan
data = [
    [1,2,3],
    [nan, nan, 2],
    [nan, nan, nan],
    [8, 8, nan]
]
df1 = pd.DataFrame(data)
# 常数填充 填充时inplace可以设置为true 这样原始数据会被覆盖
df2 = df1.fillna(100)
# 按照列索引填充 传入一个字典
df3 = df1.fillna({
     0:10, 1 : 20, 2 : 40})

print(df1)
print('df2')
print(df2)
print('df3')
print(df3)

你可能感兴趣的:(python,机器学习,算法,自然语言处理,数据分析)