黑马机器学习day1

1.sklearn数据集

sklearn.datasets

datasets.load_*()        获取小规模的数据集

datasets.fetch_*(data_home=None)        获取大规模数据集        函数的第一个参数是data_home,标识数据集下载目录,默认/scikit_learn_data/

1.1sklearn小数据集

sklearn.datasets.load_iris()

1.2sklearn大数据集

sklearn.datasets.fetch_20newsgroups(data_home=None) 

1.3数据集的返回值

datasets.base.Bunch(继承自字典)

disk["ket"] = values

bunch.key = valuse

from sklearn.datasets import load_iris

def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数数据集描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值:\n", iris.data, iris.data.shape)
    return None

if __name__ == "__main__":
    #sklearn数据集的使用
    datasets_demo()

data:特征数据数组,是[n_samples * n_features]的二维numpy.ndarry数组
target:标签数组,是n_samples的一维numpy.ndarry数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名

1.4.数据集的划分

训练数据:用于训练,构建模型

测试数据:在模型检验时使用,用于评估模型是否有效

        测试集 20%~30%

数据集划分api

sklearn.model_selection.train_test_split(arrays, *options)

x 数据集的特征值
y 数据集的标签值
test_size测试集的大小,一般为float
random_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
return训练集特征值,测试集特征值,训练集目标值,测试集目标值

return      x_train,       x_test,                 y_train,           y_test

from sklearn.model_selection import train_test_split


    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, train_size = 0.2, random_state = 22)
    print("训练集的特征值:\n",x_test,x_test.shape)

2.特征工程介绍

算法 特征工程

pandas 数据清洗,数据处理

sklearn 特征工程

2.1特征抽取/特征提取

sklearn.feature_extraction

机器学习算法 - 统计方法 - 数学公式

文本类型 - > 数值

将任意数据(文本或土象)转换为可用于机器学习的数字特征

字典特征提取(特征离散化)

文本特征提取

图像特征提取(深度学习再介绍)

2.1.1字典特征提取

字典特征提取 - 类别 -> one -hot编码

作用:对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer(sparse=True, …)

vector 数学:向量         物理:矢量

矩阵 matrix 二位数字

向量 vector 一维数组

父类:转换器类

返回sparse矩阵(sparse稀疏)将非零值 按位置表示出来

                                                   节省内存 提高加载效率

DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵
DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names_out():返回类别名称(新版)

 

from sklearn.feature_extraction import DictVectorizer


def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京', 'temperature':100},
            {'city':'上海', 'temperature':60},
            {'city':'深圳', 'temperature':30}]
    # 1.实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names_out())

    return None

if __name__ == "__main__":

    # 代码2:字典特征抽取
    dict_demo()

2.1.2字典提取应用场景:

        1.pclass,sex 数据集当中类别特征比较多

                1.将数据集的特征 -> 字典类型

                2.DictVectorizer转换

        2。本身拿到的数据就是字典类型

2.2文本特征提取

单词作为特征

句子,短语,单词,字母

特征:特征词

方法1:CountVectorizer 统计样本特征词出现的个数

        stop_words停用的

        关键词:在某一个类别的文章出现的次数很多,但是在其他类别的文章出现的次数少

sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):返回词频矩阵

CountVectorizer.fit_transform(X),X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X),X:array数组或者sparse矩阵,返回值:转换之前数据格
CountVectorizer.get_feature_names_out():返回值:单词列表

 

from sklearn.feature_extraction.text import CountVectorizer

def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['life is short,i like like python',
            'life is too long,i dislike python']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None
if __name__ == "__main__":
    #代码3: 文本的特征抽取:CountVectorizer
    count_demo()

中文:不支持单个中字

def count_chinese_demo():
    """
    中文文本特征抽取:CountVectorizer
    :return:
    """
    data = ['我 爱 北京 天安门',
            '天安门 上 太阳 升']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None
if __name__ == "__main__":
    # 代码4: 中文文本特征抽取:CountVectorizer
    count_chinese_demo()

中字分割

def cut_word(text):
    """
    进行中文分词:”我爱北京天安门“->”我 爱 北京 天安门“
    :param text:
    :return:
    """

    return " ".join(list(jieba.cut(text)))

def count_chinese_demo2():
    """
    中文本特征抽取,自动分词
    :return:
    """
    # 1.将中文文本进行分词
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 2、实例化一个转换器类
    transfer = CountVectorizer()
    # 3、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None

if __name__ == "__main__":

    #代码5 中文本特征抽取,自动分词
    count_chinese_demo2()

    # 代码6:中文分词
    # print(cut_word("我爱北京天安门"))

方法2.TfidfVectorizer

Tf-idf  - 衡量一个词的重要程度

两个词 “经济” “肥肠” 

TF - 词频(term fequency ,tf)

IDF - 逆向文档频率

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba

def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
            '我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
            '如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)

    # 2、实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["一种","所以"])
    # 3、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())

    return None

if __name__ == "__main__":

    #代码7 用TF-IDF的方法进行文本特征抽取
    tfidf_demo()

3.特征预处理 

什么是特征预处理:通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程

为什么要进行归一化/标准化:特征的单位或者大小相差较大,或者某特征的方法相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

3.1归一化

 sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
MinMaxScaler.fit_transform(X),

X:numpy array格式的数据[n_samples,n_features],

返回值:转换后的形式相同的array

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    """
    归一化
    :return:
    """
    #1.获取数据
    data = pd.read_csv("D:\PyCharm\heima\dating.txt")
    # print("data:\n", data)
    data = data.iloc[:,:3]
    print("data:\n", data)

    #2.实例化一个转换器类
    transfer = MinMaxScaler()

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

    return None

if __name__ == "__main__":
    minmax_demo()

结果 

 异常值:最大值或者最小值

注意最大值最小值是变化的,另外,最大值与最小值非常容易受到异常值影响,
所以这种方法鲁棒性较差,只适合传统精确小数据场景

3.2标准化

在这里插入图片描述

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,name结果显然会发生改变
  • 对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响不大,从而方差改变较小
  • 标准差:集中程度
  • 应用场景:在已有样本足够多的情况下比较稳定。适合现代嘈杂大数据场景

sklearn.perprocessing.StandradScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X),

X;numpy array格式的数据[n_samples,n_features],

返回值:转化后的形状相同的array

import pandas as pd
from sklearn.preprocessing import StandardScaler


def stand_demo():
    """
    标准化
    :return:
    """
    #1.获取数据
    data = pd.read_csv("D:\PyCharm\heima\dating.txt")
    # print("data:\n", data)
    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)

    return None

if __name__ == "__main__":
    #标准化
    stand_demo()

4. 特征降维

ndarray

降低的对象是:二维数组。

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

降维的两种方法:特征选择,主成分分析

4.1特征选择

定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征

Filter(过滤式):方差选择法:低方差特征过滤

                              相关系数法-特征与特征之间的相关程度

Embedded(嵌入式):决策树,

                                       正则化,

                                       深度学习

4.1.1过滤式

模块

sklearn.feature_selection

低方差特征过滤

删除低方差的一些特征

  • 特征方差小:某个特征大多样本的值比较相近
  • 特征方差大:某个特征很多样本的值都有差别

sklearn.feature_selection.VArianceThreshold(threshold=0.0)
删除所有低方差特征
Variance.fit_transform(X),

X:numpy array格式的数据[m_sample,n_features],

返回值:训练集差异低于threadshold的特征将被删除。默认值是保留非零方差特征,即删除所有样本中具有相同值的特征
 

import pandas as pd

from sklearn.feature_selection import VarianceThreshold


def variance_demo():
    """
    低方差特征过滤
    :return:
    """
    # 1、获取数据
    data = pd.read_csv('factor_returns.csv')
    print('data:\n', data)
    data = data.iloc[:,1:-2]
    print('data:\n', data)

    # 2、实例化一个转换器类
    #transform = VarianceThreshold()
    transform = VarianceThreshold(threshold=5)

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

    return None

if __name__ == "__main__":
    #过滤低方差特征
    variance_demo()

 4.1.2相关系数

皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标

 在这里插入图片描述

相关系数的值介于-1与+1之间,即-1<=r<=+1。其性质如下:

当r>0时,表示两变量正相关;r<0时,两变量为负相关
当|r|=1时,表示两变量为完全相关;当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近0,表示两变量的线性相关越弱
一般可按三级划分:|r|<0.4为低度相关;0.4<=|r|<0.7为显著相关;0.7<=|r|<1为高维线性相关
 

from scipy.stats import pearsonr

  • x:(N.)array_like
  • y:(N.)array_like Returns:(Perason’s correlation coefficient, p-value)
  • import pandas as pd
    
    from sklearn.feature_selection import VarianceThreshold
    from scipy.stats import pearsonr
    
    def variance_demo():
        """
        低方差特征过滤
        :return:
        """
        # 1、获取数据
        data = pd.read_csv('factor_returns.csv')
        print('data:\n', data)
        data = data.iloc[:,1:-2]
        print('data:\n', data)
    
        # 2、实例化一个转换器类
        #transform = VarianceThreshold()
        transform = VarianceThreshold(threshold=5)
    
        # 3、调用fit_transform
        data_new = transform.fit_transform(data)
        print("data_new\n", data_new, data_new.shape)
    
        #计算某两个变量之间的相关系数
        r1 = pearsonr(data["pe_ratio"],data["pb_ratio"])
        print("相关系数:\n", r1)
        r2 = pearsonr(data["revenue"],data['total_expense'])
        print("revenue和total_expense的相关性:\n", r2)
    
    
        return None
    
    if __name__ == "__main__":
        #过滤低方差特征
        variance_demo()
    

  • 特征与特征之间相关性很高:

    • 1选取其中一个

    • 加权求和

    • 主成分分析 

4.1.3主成分分析

定义:高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息
应用:回归分析或者聚类分析中

sklearn.decomposition.PCA(n_components=None)

将数据分解为较低维度空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征
PCA.fit_transform(X),X:numpy array格式的数据[N_samples, n_features],

返回值:转换后指定维度的array

from sklearn.decomposition import PCA


def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    #1.实例化一个转化器类
    transfer = PCA(n_components=0.95)
    #2.调用了fit_transfer
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

if __name__ == "__main__":
    #PCA降维
    pca_demo()

保留95%

 5.案例

探究用户对物品类别的喜好细分

用户 user_id

物品类别 aisle

1)需要将user_id和aisle放在同一表中

2)找到user_id和aisle关系 - 交叉表和透视表

3)特征冗余过多 -> PCA降维

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/65620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】类和对象

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

使用eXosip+ffmpeg、ffplay命令行实现sip客户端

文章目录 前言一、关键实现1、主要流程2、解决端口冲突&#xff08;1&#xff09;、出现原因&#xff08;2&#xff09;、解决方法 3、解析sdp&#xff08;1&#xff09;、定义实体&#xff08;2&#xff09;、解析视频&#xff08;3&#xff09;、解析音频 4、命令行推拉流&am…

Python中搭建IP代理池的妙招

在Python的爬虫世界里&#xff0c;你是否也想搭建一个功能强大的IP代理池&#xff0c;让你的爬虫无忧无虑地畅游各大网站&#xff1f;今天&#xff0c;我就来教你使用Scrapy框架搭建IP代理池&#xff0c;让你的爬虫更加智能、高效&#xff01;跟着我一步一步来&#xff0c;轻松…

(力扣)用两个队列实现栈---C语言

分享一首歌曲吧&#xff0c;希望在枯燥的刷题生活中带给你希望和勇气&#xff0c;加油&#xff01; 题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#…

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0&#xff5e;AIN10为模拟输入端&#xff1b; 15——CS 为片选端&#xff1b; 17——DIN 为串行数据输入端&#xff1b;&#xff08;控制字输入端&#xff0c;用于选择转换及输出数据格式&#xff09; 16——…

大数据课程G2——Hbase的基本架构

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Hbase的基本架构; ⚪ 掌握Hbase的读写流程; ⚪ 掌握Hbase的设计与优化; 一、基本架构 1. HRegion 1. 在HBase中,会将一个表从行键方向上进行切分,切分成1个或者多个HRegion。 …

C++入门(小白篇1—编译器安装-代码注释等)

前言&#xff1a; 最近想学一下一下C看了一些博客内容写的倒是很充实&#xff0c;但是&#xff0c;细节不到位&#xff0c;我是有Python基础的&#xff0c;所以学习来蛮快的&#xff0c;但是对于小白的话&#xff0c;有好多小细节大多数博客还是不够详细&#xff0c;由此我想写…

对话Sam Altman与Greg Brockman:初心和过去,信念和现在,责任和未来

导读 近日&#xff0c;硅谷著名投资人Reid Hoffman和Aria Finger联手对Sam Altman和Greg Brockman进行了一场访谈&#xff0c;访谈涉及到主题有&#xff1a;OpenAI的使命&#xff0c;人工智能对教育、医疗等行业的变革性影响&#xff0c;人工智能如何面对监管&#xff0c;OpenA…

十九、docker学习-Dockerfile

Dockerfile 官网地址 https://docs.docker.com/engine/reference/builder/Dockerfile其实就是我们用来构建Docker镜像的源码&#xff0c;当然这不是所谓的编程源码&#xff0c;而是一些命令的集合&#xff0c;只要理解它的逻辑和语法格式&#xff0c;就可以很容易的编写Docke…

Effective Java笔记(28)列表优于数组

数组与泛型相比&#xff0c;有两个重要的不同点 。 首先&#xff0c;数组是协变的&#xff08; covariant &#xff09; 。 这个词听起来有点吓人&#xff0c;其实只是表示如果 Sub 为 Super 的子类型&#xff0c;那么数组类型 Sub[ ]就是Super[ ]的子类型。 相反&#xff0c;泛…

【maven】构建项目前clean和不clean的区别

其实很简单&#xff0c;但是百度搜了一下&#xff0c;还是没人能简单说明白。 搬用之前做C项目时总结结论&#xff1a; 所以自己在IDE里一遍遍测试程序能否跑通的时候&#xff0c;不需要clean&#xff0c;因为反正还要改嘛。 但是这个项目测试好了&#xff0c;你要打成jar包给…

【Vue3】动态组件

动态组件的基本使用 动态组件&#xff08;Dynamic Components&#xff09;是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件&#xff0c;可以使用 元素&#xff0c;并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…

AirServer2023最新Mac苹果电脑系统投屏软件

AirServer是一个Mac专用投屏工具&#xff0c;功能强大&#xff0c;并且可以通过网络和其他平台同步视频内容。可以使用多个设备进行投屏&#xff0c;快速查看同一局域网内的视频。支持的设备&#xff1a;苹果系统。支持 Windows、 Mac、 Android、 iOS、 windows平台。通过这款…

C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究

C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究 code review! 文章目录 C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究1.传递对象的const引用——ClassB的实例只能访问ClassA的实例&#xff0c;但不会修改ClassA的实…

js:Markdown编辑器Vue3版本md-editor-v3

文档 https://github.com/imzbf/md-editor-v3https://imzbf.github.io/md-editor-v3/zh-CN/index 安装 npm install md-editor-v3使用 <template><MdEditor v-model"text" /> </template><script setup> import { ref } from vue; impor…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置&#xff1a;CentOs 7.6以上版本&#xff0c;我的版本是7.9&#xff0c;不要对yum换源&#xff0c;否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令&#xff0c;是…

网络优化工程师,你到底了解多少?

5G网络优化工程师到底是什么&#xff1f; 5G&#xff0c;第五代移动通信技术&#xff08;5th Generation Mobile Communication Technology&#xff0c;简称5G&#xff09;是具有高速率、低时延和大连接特点的新一代宽带移动通信技术&#xff0c;5G通讯设施是实现人机物互联的…

【MySQL】sql字段约束

在MySQL中&#xff0c;我们需要存储的数据在特定的场景中需要不同的约束。当新插入的数据违背了该字段的约束字段&#xff0c;MySQL会直接禁止插入。 数据类型也是一种约束&#xff0c;但数据类型这个约束太过单一&#xff1b;比如我需要存储的是一个序号&#xff0c;那就不可…

也谈态势感知的嵌套与级联

不同颗粒度的态势感知可以嵌套在一起&#xff0c;形成一个层次结构&#xff0c;从而提供全面和多层次的信息获取和理解。 在态势感知中&#xff0c;颗粒度可以理解为观察、收集和分析信息的细节程度。较高颗粒度的态势感知关注的是具体的事件、行动或细节&#xff0c;提供了详细…