栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 环境
  • 数据集
  • 特征提取
    • 字典特征提取
    • 文本特征提取
    • One-Hot 编码
    • 中文文本处理
    • TF-IDF 处理
      • 运算规则
      • 代码
  • 数据预处理
    • 归一化
    • 标准化
  • 降维
    • 特征选择
      • Filter 过滤方式
        • 低方差过滤
        • 相关系数
    • 主成分分析 PCA
  • 小结

环境

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神经网络直接死那了。

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

这个也是最典型的,所有的数据的范围都在(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 - μ ) / σ

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

此外

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)



png)]

相关系数

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

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

这里还是上例子吧:

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

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

举个例子

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

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)
小结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/503651.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号