Sklearn机器学习基础(day01基本数据处理)

环境

python 3.7

sklearn

numpy

scipy

pip3 install numpy
pip3 install scipy
pip3 install sklearn

(本文为笔记整理)

数据集

sklearn 自带一些常用的数据集帮助我们进行相关的测试。

sklearn.datasets

load_*  获取小规模数据集
fetch_* 获取大规模数据集
sklearn小数据集
sklearn.datasets.load_iris()
    
    
sklearn大数据集   sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

这里注意的是获取大数据集其实是从对应的网站下载的,data_home 是指那个对应的下载保持目录(有默认的) subset 是指你要下载哪一些东西

test 表示要测试数据 all 表示要test和train训练好的都要。

例子:

from sklearn.datasets import load_iris

Iris = load_iris()
print("查看数据描述:",Iris["DESCR"])
print("查看特征值名字:",Iris.feature_name)
print("查看特征值:",Iris.data)
print("查看数据集: ",Iris)

这个数据集是关于那个 鸢尾(花) 的样子的数据集合

特征提取

作用:将其他的数据类型(例如 文本) 按照特定的算法进行“扁平化处理”,即转化为特定的规律的具备”关系“的矩阵

字典特征提取

这个的作用其实就是把字典类型的数据转化为矩阵,这样一来方便相关的运算,那么字典特征提取就是类似的算法。

直接举个例子就懂了:

data = [{
    
    "city":"北京","template":25},
        {
    
    "city":"上海","template":55},
        {
    
    "city":"南昌","template":45}
       ]

直接查看处理好之后的数值:

特征名字: ['city=上海', 'city=北京', 'city=南昌', 'template']
特征值: [[ 0.  1.  0. 25.]
 		[ 1.  0.  0. 55.]
 		[ 0.  0.  1. 45.]
     ]

当然这个是没有压缩的展现效果,如果压缩了,那就是一个压缩矩阵

特征名字: ['city=上海', 'city=北京', 'city=南昌', 'template']
特征值:   (0, 1)	1.0
  		 (0, 3)	25.0
  		 (1, 0)	1.0
  		 (1, 3)	55.0
  		 (2, 2)	1.0
  		 (2, 3)	45.0

ok那么这里直接看代码:

from sklearn.feature_extraction import DictVectorizer

def DictVectorizer_Test():
    data = [{
    
    "city": "北京", "template": 25},
            {
    
    "city": "上海", "template": 55},
            {
    
    "city": "南昌", "template": 45}
            ]

    transfer = DictVectorizer()

    new_data = transfer.fit_transform(data)
    print("特征名字:",transfer.get_feature_names())
    print("特征值:",new_data)

我们这里最重要的就是用到了这个 DictVectorizer

文本特征提取

既然已经大致知道了这个特征提取是啥子东西,那么我们接下来就来看看对于,文本进行特征提取。

那么关于文本提取 sklearn 主要有两种比较有名的玩意,同时处理文本的时候又分为,英文处理和中文处理。

一个一个来。

One-Hot 编码

大道理就不说了,直接说效果吧,那就是这个可以吧一句话当中出现的单词的频率统计出来。至于有啥用,那作用多了去了。

直接举个例子:

data = ["life is short i like python","python is great but i prefer golan

处理之后的结果:

特征名字: ['but', 'golang', 'great', 'is', 'life', 'like', 				'prefer', 'python', 'short']
特征值: [
    	 [0 0 0 1 1 1 0 1 1]
 		 [1 1 1 1 0 0 1 1 0]
     	]

同样这个也是没有压缩的,压缩后效果和上面类似。

代码

from sklearn.feature_extraction.text import CountVectorizer

def CountVertorizer_Test():
    data = ["life is short i like python","python is great but i prefer golang"]
    tranfer = CountVectorizer()
    new_data = tranfer.fit_transform(data)
    print("特征名字:",tranfer.get_feature_names())
    print("特征值:",new_data.toarray())

中文文本处理

这边我们还是举个例子,用 one-hot 编码处理一下。

这里的话我们需要使用到一个第三方库 jieba

这个玩意主要是做中文分割的。

直接上代码:

def To_Chinese_World(worlds):

    """
    返回一个切个好的中文数组
    :param worlds:
    :return:
    """
    index = 0
    for word in worlds:
        worlds[index] = " ".join(list(jieba.cut(word)))
        index+=1
def CountVectorizer_Chinese(data):

    To_Chinese_World(data)

    tranfer = CountVectorizer()
    new_data = tranfer.fit_transform(data)

    print("特征名字:",tranfer.get_feature_names())
    print("特征值:",new_data.toarray())
if __name__ == '__main__':
    data = ["我爱大中华,我是中国人"]
    CountVectorizer_Chinese(data)

TF-IDF 处理

这个其实也是用来对文本进行特征提取的。不过这里的主要作用是用来提取关键词的。

关键词定义:在当前的文本当中出现的频率极高,但是在其他的文本当中出现的频率极低。具备非常明显的分类属性

那么这个 TF - IDF 就是用来处理这件事情的。

运算规则

这个算法的运算规则还是比较简单的。举个例子:

    data = [
        "water water water x",
        "apple apple apple x",
        "pear pear pear x",

    ]

假设每一个字符串都是一个文本 那么很明显关键词一次是:

water apple pear

那么要想实现这个效果首先是这样运算的

TF 是同频,例如 apple 在 "apple apple apple x"出现的频率 这里是3/4

IDF 是逆文档频率 例如 apple 在 三个字符串当中有哪几个字符串是有 apple的,这里是 1 那么 IDF = lg (3/1)

TF-IDF = TF * IDF

代码

from sklearn.feature_extraction.text import TfidfVectorizer
def TFIDFVectorizerTest():
    data = [
        "water water water x",
        "apple apple apple x",
        "pear pear pear x",

    ]

    transfer = TfidfVectorizer()
    new_data = transfer.fit_transform(data)
    print("特征名字:",transfer.get_feature_names())
    print("特征值:",new_data.toarray())

结果:

特征名字: ['apple', 'pear', 'water']
特征值: [
    	[0. 0. 1.]
 		[1. 0. 0.]
 		[0. 1. 0.]
     	]

此时一目了然 第一个关键词是 water 以此类推

到这里你自己都可以实现一个简单的文章分类器了。

数据预处理

归一化

这个老熟悉了,作用就是统一衡量,也就是无量纲化,这个在神经网络的数值预测里面还是很重要的,当初数学建模的时候要是没有归一化处理数据,BP神经网络直接死那了。

对应的归一化的算法也很多,看你喽,最简单的就是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hsquux7t-1636988903105)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115200610628.png)]

这个也是最典型的,所有的数据的范围都在(0,1)之间。

对应API

sklearn.preprocrssing.MinMaxScaler

直接举个例子:

from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
def MinMaxScalerTest():
    """
    归一化
    :return:
    """
    # 1、获取数据只要前三列,\t 是为了正常输出
    data = pd.read_csv("dating.txt",sep="\t")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    #transfer = MinMaxScaler(feature_range=[2, 3])
    transfer = MinMaxScaler(feature_range=[2, 3])
    #默认[0,1]

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

数据集:

链接:https://pan.baidu.com/s/1Q-4zKBx3ICFNLmGbmVsoPQ
提取码:6666

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.3324



data_new:
 [[0.44832535 0.39805139 0.56233353]
 [0.15873259 0.34195467 0.98724416]
 [0.28542943 0.06892523 0.47449629]
 ...
 [0.29115949 0.50910294 0.51079493]
 [0.52711097 0.43665451 0.4290048 ]
 [0.47940793 0.3768091  0.78571804]]

标准化

由于归一化很容易受到超大数据的干扰,稳定性较差(在数据相差较大的场景当中)所以我们这里还有一个叫做标准化。

x* = (x - μ ) / σ

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

此外

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOVQT2nX-1636988903106)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115203659529.png)]

z-score 标准化后的数据标准差为1

没关系不懂调 API 就好。

sklearn.preprocrssing.StandarScaler

例子:

def StandardScalerTest():

    data = pd.read_csv("dating.txt",sep="\t")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = StandardScaler()

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

其实你发现调用规则都是一样的,就是算子不同(用Flink的话来说)

降维

降低数据的维度。其实和数据结构里面的那个矩阵存储不一样。

因为我们前面处理的都是使用二维数组来搞的,对于高维的我们必然是要搞到二维里面去的。有点像“拍扁”。也就是说,我们会损失一部分的数据(减少不必要的数据干扰项,减少数据冗余),来实现“拍扁”。

特征选择

大白话:从原有特征当中找出主要特征。

Filter 过滤方式

数据集:

链接:https://pan.baidu.com/s/1uj6cuR0P6lZLDOm35jKm9A
提取码:6666

低方差过滤

计算方差,把方差低的过滤不要

from sklearn.feature_selection import VarianceThreshold


def VarianceThresholdTest():


    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2] #有些数据不要,有些列,例如第一列
    print("data:\n", data)

    transfer = VarianceThreshold(threshold=10)

    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new, data_new.shape)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQGNmN1i-1636988903107)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115210525226.
png)]

相关系数

这个我们要避免冗余呗,所以相关系数太近直接处理然后pass

这个相关系数怎么求,把两两的特征作为x ,y 然后求取相关性系数呗。这个怎么算,查查百度或者去问问高中数学老师去呗。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThUpU2vI-1636988903108)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115210935521.png)]

这里还是上例子吧:

from scipy.stats import pearsonr
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)

那么之后怎么做还用我说吗,直接for循环比较筛选出特征,然后那啥从data里面筛选。

主成分分析 PCA

大白话:高维变低纬,但是这个过程当中可能会舍弃原有数据并创造新的数据,有可能损失信息。作用就是压缩数据,应用,聚类分析,回归分析。

举个例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEGtr1S8-1636988903108)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212204022.png)]

现在把这个压缩到一条直线并且尽可能地去贴合原有特征。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljeBPk0E-1636988903109)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212325415.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQnADQ6E-1636988903109)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212406495.png)]

def PCATest():
    """
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1、实例化一个转换器类
    transfer = PCA(n_components=0.95)
    # n_components=0.95 保留 95%特征 如果传入整数就是减少到多少空间也就是降到几维度  n_components=2

    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

小结

好好学习,天天向上,自己选的路死都要走下去!

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/121345918