机器学习之sklearn


机器学习笔记之sklearn

sklearn是机器学习中重要的测试数据集来源之一,并且可以提供特征提取以及降维聚类等功能

蒟蒻从今天起开始机器学习调库调参的第一步,

sklearn数据集介绍

引入:

数据集的操作有:

  • load_*获取自带的较小的数据集
  • fetchg_*获取外部的较大的数据集
import sklearn.datasets 
from sklearn.datasets import load_iris //导入鸢尾花数据集
iris=load_iris()
print("鸢尾花的数据集返回值",iris)
print("鸢尾花数据的描述",iris["DESCR"])
print("鸢尾花数据的特征值",iris.data)
print("鸢尾花的目标值",iris.target)
print("鸢尾花的特征值名字",iris.data.shape)
print("鸢尾花的特征值名字",iris.feture_name)

sklearn返回值介绍:

  • load 和fetch返回的是字典格式
    • data:特征数据集
    • target:标签数据
    • DESCR:数据描述
    • feature_names:特征名字,新闻数据,手写数字,回归数据集没有
    • target_name:标签名

数据集划分

进行机器学习的时候我们要对数据集进行划分,划分成训练集和测试集

​ 一般来说,测试集所占比例比较少:

  • 一般:测试集一般占比20%~30%{sklearn库中划分函数默认25%}
  • 训练集特征值,测试集特征值,训练集特征值。测试目标集特征值分别是:x_train x_test y_train y_test

训练集划分api:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris=load_iris()
print("鸢尾花的数据集返回值", iris)
print("鸢尾花数据的描述", iris["DESCR"])
print("鸢尾花数据的特征值", iris.data)
print("鸢尾花的目标值", iris.target)
print("鸢尾花的特征值名字", iris.data.shape)
print("鸢尾花的特征值名字", iris.feature_names)
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
//第一个参数:数据集x的特征值,第二个参数数据集y的特征值,测试集的占比,第三个随机分配时数种子
//返回:训练集特征值,测试集特征值,训练集目标值,测试集目标值

特征提取

即是对一些非数值的数据,比如对文本语音图像等,将其转换成数值化,便于进行矩阵运算

特征提取用于降维等等

特征工程:

一般用sklearn进行特征提取、

而用pandas进行数据清洗,数据抽取,等预处理工作

  • 目标

    • 应用DicVectorizer实现对类别特征进行数值化离散化
    • 应用CountVectorizer实现对文本特征进行数值化
    • 应用TfidVectorizer实现对文本特征进行数值化
  • 特征提取api

    sklearn.feature_extraction

对字典进行数值化抽取

from sklearn.feature_extraction import DictVectorizer
def dict_demo():
    data = [{'city': 'beijing', 'number': 1}, {'city': 'guangdong', 'number': 4}, {'city': 'shanghai', 'number': 3}]
    transfer = DictVectorizer()  # 实例化转换器
    data_new = transfer.fit_transform(data)
    print("data_new:", data_new)
    print("data_new的名字:", transfer.feature_names_)#查看矩阵各列代表属性
    return None
if __name__ == "__main__":
    dict_demo()

返回的矩阵:

data_new:   (0, 0)    1.0
  (0, 3)    1.0
  (1, 1)    1.0
  (1, 3)    4.0
  (2, 2)    1.0
  (2, 3)    3.0

返回的是一个稀疏矩阵,当把稀疏矩阵转换成矩阵形式的时候,设置稀疏矩阵false
transfer = DictVectorizer(sparse=False)
输出:
data_new: [[1. 0. 0. 1.]
 [0. 1. 0. 4.]
 [0. 0. 1. 3.]]
 data_new的名字: ['city=beijing', 'city=guangdong', 'city=shanghai', 'number']

文本特征提取

from sklearn.feature_extraction.text import CountVectorizer

def count_demo():
    data = ["lfe is short l like python", "life is short ,code more"]
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
     print("特征名字:\n",transfer.get_feature_names())#调用此方法获取矩阵的值
    return None


if __name__ == "__main__":
    count_demo()

同样返回的是一个稀疏矩阵:

data_new:
   (0, 2)    1
  (0, 1)    1
  (0, 7)    1
  (0, 4)    1
  (0, 6)    1
  (1, 1)    1
  (1, 7)    1
  (1, 3)    1
  (1, 0)    1
  (1, 5)    1
  特征名字:
 ['code', 'is', 'lfe', 'life', 'like', 'more', 'python', 'short']
    #可见过滤了I等低频词汇
    #若对中文进行词频抽取,要用空格隔开词语

中文文本抽取

from sklearn.feature_extraction.text import CountVectorizer(stop_word=[])

这里的stop_word是跳过词,抽取时忽略这个词,自然语言处理时用停顿词表进行无关词语忽略

这里把把is和like作为停顿词

transfer = CountVectorizer(stop_words=['is', 'like'])

输出特征名字:
[‘code’, ‘lfe’, ‘life’, ‘more’, ‘python’, ‘short’]

中文文本抽取:

由于中文文本在CountVectorizer中使用必需分词,所以要调用jieba的分词函数

import jieba  # 对中文文本进行分词处理

def cut_word(text):
    # 中文文本分词函数
    text = "".join(list(jieba.cut(text)))
    # jibe分词函数->转化成;列表—>转化成字符串
    return text


def count_Chinese():
    data = ["一种还是一种今天很残酷,明天更加残酷,但是对大部分人来说", "进行机器学习的时候我们要对数据集进行划分,划分成训练集和测试集", "一般来说,测试集所占比例比较少",
            "训练集特征值,测试集特征值,训练集特征值。测试目标集特征值分别是:x_train x_test  y_train y_test"]
    data_new = []
    for i in data:
        data_new.append(cut_word(i))
    print(data_new)
    return None


if __name__ == "__main__":
    count_Chinese()

然后对生成列表进行特征抽取

然而这样的特征抽取没有突出高频率词汇,所以要对高频率词汇进行提取

但是有些词比较辣鸡,不该作为信息抽取

文本特征抽取2

关键词:在某一个类别的文章中出现次数多,但在其他文章中出现次数少的词汇,标志了一个文本的特征

Tf-idf文本特征抽取原理即是如此

tf:词频

idf:逆向文本频率:

由文本文件数目除以包含词语的文件的数目,再将得到的商取以10为底的对数

Tf-idf=tf*idf

举例:

语料库:1000文章

100文章有非常

10偏有经济

两篇文章:

​ A文章(100词):经济10词

​ ‘经济’:

​ tf=0.1

​ idf=log 10 1000/10=2

​ Tf-idf=0.2

​ B文章(100词):非常10词

​ ‘非常’:

​ tf=0.1

​ idf=log 10 1000/100=1

​ Tf-idf=0.1

ApI

from sklearn.feature_extraction.text import TfidfVectorizer
def Tfidf_demo():
    data = ["lfe is short l like python", "life is short ,code more"]
    transfer = TfidfVectorizer(stop_words=['is', 'like'])
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())
    return None
#就实例化的时候改了下转换器的名字

if __name__ == "__main__":
    Tfidf_demo()

实例化和提取操作类似于CountVectorizer,同样有停顿词功能

返回:

data_new:
   (0, 4)    0.6316672017376245
  (0, 5)    0.4494364165239821
  (0, 1)    0.6316672017376245
  (1, 3)    0.534046329052269
  (1, 0)    0.534046329052269
  (1, 2)    0.534046329052269
  (1, 5)    0.37997836159100784
特征名字:
 ['code', 'lfe', 'life', 'more', 'python', 'short']

数据预处理

归一化

为了使数据更加适合算法模型处理

归一化就是在将数据处理在一定中范围内

如果不对数据进行归一化处理,那么数据将会由于某一个特征值过于巨大而导致其他特征值被忽略,(在聚类中的欧式距离计算中尤为明显)

所以要将几个数据项的值固定在一个统一的范围内:

数学上叫做无量纲化

公式

x'=(x-min)/(max-min)
x''=x'*(mx-mi)+mi

例如有数据[90,60,75]

对于数据90:

x’=(90-60)/(90-60)=1

x”=1*(1)+0=1 #放缩到1-0区间,mx=1,mi=0

ApI:

import pandas as pd#调用pandas清洗函数
from sklearn.preprocessing import MinMaxScaler#调用归一化函数
def minmax():
    data=pd.read_csv("titanic/test.csv")
    data=data.iloc[:6, :2]
    #截取数据前两列前6行
    trans=MinMaxScaler()#实例化转换器
    datanew=trans.fit_transform(data)
    print(datanew)
    return None


if __name__ == "__main__":
    minmax()

输出:

[[0.  1. ]
 [0.2 1. ]
 [0.4 0. ]
 [0.6 1. ]
 [0.8 1. ]
 [1.  1. ]]

这样在处理聚类数据的时候可以减少特征值之间的差距

标准化处理

当数据中有缺失值和异常值,做归一化处理得到的数据可能会有缺陷,这种方式鲁棒性较差,只适合传统的精确度小的数据处理

异常值通常是:

  • 最大值
  • 最小值

标准化定义

对原始数据变换将数据变为均值为0,标准差为1

公式:

x’=(x-mean)/std

std=标准差

API

from sklearn.preprocessing import MinMaxScaler,StandardScaler
#即在原来归一化基础上实例的时候改了转换器就行
def std_demo():
    data = pd.read_csv("titanic/test.csv")
    data = data.iloc[:6, :2]
    # 截取数据前两列前6行
    trans = StandardScaler() # 实例化转换器
    datanew = trans.fit_transform(data)
    print(datanew)
    return None


if __name__ == "__main__":
    std_demo()

返回:

[[-1.46385011  0.4472136 ]
 [-0.87831007  0.4472136 ]
 [-0.29277002 -2.23606798]
 [ 0.29277002  0.4472136 ]
 [ 0.87831007  0.4472136 ]
 [ 1.46385011  0.4472136 ]]

降维

降维是在某些限定的条件,降低随机特征的个数,得到一组不相关主变量的过程

维数:嵌套层数

  • 0维:标量
  • 1维:向量
  • 2维:矩阵

降低的对象:二维数组

此处降维:降低列数

  • 相关特征:
    • 相对湿度与降雨量之间的关系
    • 等等

正是因为在进行训练的时候,我们都是使用特征进行学习的,如果有特征本身存在问题或者特征之间相关性比较强,对于算法学习的预测影响会比较大

降维的两种方法:

  • 特征选择
  • 主成分分析

特征选择:

数据中包含冗余的或相关变量,希望在原有特征中找出主要特征

方法:

  • filter过滤式
    • 方差选择法:低方差特征过滤(说明此属性共有不必要)
    • 相关系数法:特征与特征之间的相关程度
  • embeded嵌入式
    • 决策树
    • 正则化
    • 深度学习

低方差特征过滤

API

import pandas as pd
from sklearn.feature_selection import VarianceThreshold
def varianse_demo():
    # 过滤低方差
    data = pd.read_csv("titanic/test.csv")
    data = data.iloc[:5, :2]
    transfer = VarianceThreshold()
    data = transfer.fit_transform(data)
    print(data)
    return None

if __name__ == "__main__":
    varianse_demo()

相关系数

皮尔森相关系数:

公式略

特点:

  • 当r>0正相关,R<0负相关
  • 当r=-1or1完全相关,r=0表示毫无关系
  • 越近于1相关性越强
  • 0.4<abs(r)<0.7说明有一定相关性

Api:

import pandas as pd
from scipy.stats import pearsonr
def varianse_demo():
    # 过滤低方差
    data = pd.read_csv("titanic/test.csv")
    data = data.iloc[:5, :2]
    r = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print(r)
    return None


if __name__ == "__main__":
    varianse_demo()

如果特征与多个特征之间相关性很高:

  • 选取其中一个

  • 加权求和

  • 主成分分析


文章作者: 晓沐
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓沐 !
评论
 上一篇
tensoflow基础 tensoflow基础
Tensorflow基础​ TensorFlow是现在比较火爆的一个深度学习的框架,内部集成了多种优化算法还有模型框架,所以对初学者十分友好,所以今天起开始自己的TensorFlow第一步 训练自己的第一个神经网络代码如下 第一次上
2020-11-11
下一篇 
pandaa&&numpy学习笔记 pandaa&&numpy学习笔记
numpy,matplotlib,pandas以及文件批量操作写在前面,由于自己python基础能力有点菜,并且基本上每上手一个框架都需要这四方面的操作以及掌握,所以我决定恶补这方面的不足,故有了这样一篇博客,持续更新中~ 环境:cond
  目录