机器学习基础1


机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
在这里插入图片描述
机器学习使用场景

  1. 自然语言处理
  2. 无人驾驶
  3. 计算机视觉
  4. 推荐系统

数据来源和类型

数据来源

  1. 企业日益积累的大量数据
  2. 政府掌握的各种数据
  3. 科研机构的实验数据

数据类型

  1. 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
  2. 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。

离散型是区间内不可分,连续型是区间内可分

可用已有数据集

  1. scikit- learn
    1. 数据量较小
    2. 方便学习
  2. Kaggle特点:
    1. 大数据竞赛平台
    2. 80万科学家
    3. 真实数据
    4. 数据量巨大
  3. UCI特点:
    1. 收录了360个数据集
    2. 覆盖科学、生活、经济等领域
    3. 数据量几十万

机器学习的数据主要是文件

常用数据集的构成

结构:特征值+目标值
例:通过肤色,身高、体重等区分男女
特征值:肤色 身高 体重
目标值:男/女
每一条数据又可称为样本,有些数据可用没有目标值

数据的特征工程

特征工程是将原始数据转换为能更好地代表预测模型的潜在问题的特征(一般为数值)的过程,从而提高了对未知数据的模型准确性

特征工程会直接影响到预测结果的准确性

使用sklearn特征抽取API:sklearn.feature_extraction

字典特征抽取

作用:对字典数据进行特征值化
类:sklearn.feature_extraction. Dictvectorizer

Dictvectorizer语法
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换

from sklearn.feature_extraction import DictVectorizer
def dictvect():
    """
    字典数据抽取
    :return: None
    """
    dict = DictVectorizer()
    #调用fit_transform
    data = dict.fit_transform([{'city': '北京', 'temperature': 100}, 
    {'city': '上海','temperature': 60}, {'city': '深圳', 'temperature': 30}])
    print(data)
    print()
    print(dict.get_feature_names())
    return None


if __name__=="__main__":
    dictvect()

输出结果:
  (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

['city=上海', 'city=北京', 'city=深圳', 'temperature']
文本特征抽取

作用:对文本数据进行特征值化
方式1:
类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵
CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
CountVectorizer.get_feature_names()
返回值:单词列表

one-hot编码
编码仅含有0 1,用0,1 来代表是否有该特征值

from sklearn.feature_extraction.text import CountVectorizer
def countvec():
    """
    文本数据抽取
    :return: None
    """
    cv=CountVectorizer()
    data=cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
    print(cv.get_feature_names())
    print()
    print(data)#data是sparse矩阵
    print()
    print(data.toarray())#利用toarray()进行sparse矩阵转换array数组
    print()
    return None


if __name__=="__main__":
    countvec()
 
 输出结果
 ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

  (0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	1
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1

[[0 1 1 1 0 1 1 0]# 词汇出现与否
 [1 1 1 0 1 1 0 1]]

单个字母没有分类依据
对于中文默认不支持这样的特征提取
使用jiebaf分词从而对对中文进行文本特征化
pip install jieba

方式2:TF-IDF 最常用方法
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

tf:term frequency :词的频率
idf:逆文档频率 =log(总文档数/该词出现的文档数目)

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer(stop_words=None,…)
返回词的权重矩阵
TfidfVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
返回值:单词列表

from sklearn.feature_extraction.text import TfidfVectorizer
def tfvec():
    """
    文本数据抽取
    :return: None
    """
    tf=TfidfVectorizer()
    data=tf.fit_transform(["life is short,i like python","life is too long,i dislike python"])
    print(tf.get_feature_names())
    print()
    print(data)
    print()
    print(data.toarray())#利用toarray()进行sparse矩阵转换array数组

    print()
    return None
输出结果:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

  (0, 5)	0.3793034928087496
  (0, 3)	0.5330978245262535
  (0, 6)	0.5330978245262535
  (0, 1)	0.3793034928087496
  (0, 2)	0.3793034928087496
  (1, 0)	0.47042642808546326
  (1, 4)	0.47042642808546326
  (1, 7)	0.47042642808546326
  (1, 5)	0.33471227807190734
  (1, 1)	0.33471227807190734
  (1, 2)	0.33471227807190734

[[0.         0.37930349 0.37930349 0.53309782 0.         0.37930349 0.53309782 0.        ]
 [0.47042643 0.33471228 0.33471228 0.         0.47042643 0.33471228 0.         0.47042643]]
 #数值:tf idf部分相乘


if __name__=="__main__":
    tfvec()

数据的特征预处理

通过特定的统计方法(数学方法)将数据转换成算法要求的数据
在这里插入图片描述
处理方法:
数值型数据:标准缩放:1、归一化 2、标准化 3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分

sklearn特征处理API:sklearn. preprocessing

归一化

在这里插入图片描述

sklearn归一化API: sklearn.preprocessing.MinMaxScaler

MinMaxScalar(feature_range=(0,1)…)
feature_range=(0,1)
每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array

from sklearn.preprocessing import MinMaxScaler

def mm():
    """
    归一化
    :return:None
    """
    mm=MinMaxScaler(feature_range=(2,3))
    data=mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)
    return None

if __name__=="__main__":
    mm()
    
输出结果:
[[3.         2.         2.         2.        ]
 [2.         3.         3.         2.83333333]
 [2.5        2.5        2.6        3.        ]]

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

标准化

在这里插入图片描述
sklearn特征化API: sklearn.preprocessing.StandardScaler
StandardScaler(…)处理之后每列来说所有数据都聚集在均值0附近方差为1

StandardScaler.fit_transform(X,y)
X:numpy
array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
StandardScaler.mean_
原始数据中每列特征的平均值
StandardScaler.std_
原始数据每列特征的方差

from sklearn.preprocessing import StandardScaler


def stand():
    """
    标准化化
    :return:None
    """
    std=StandardScaler()
    data=std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
    print(data)

if __name__=="__main__":
    stand()

输出结果:
 [[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

总结:
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然
会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对
于平均值的影响并不大,从而方差改变较小。

缺失值

在这里插入图片描述
由于每列是一个特征 故一般用列填补

sklearn缺失值API: sklearn.impute.SimpleImputer

Imputer(missing_values=np.nan, strategy=‘mean’)
完成缺失值插补
Imputer.fit_transform(X,y)
X:numpy.array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array

1、 numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
2、如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float
型的数组即可

from sklearn.impute import SimpleImputer
import numpy as np


def im():
    """
    缺失处理
    :return:None
    """
    im = SimpleImputer(missing_values=np.nan, strategy='mean')
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)

if __name__=="__main__":
    im()
 
 输出结果:
 [[1. 2.]
 [4. 3.]
 [7. 6.]]

数据降维

降维是指减少特征的数量

特征选择

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
特征选择的原因:
有冗余——部分特征的相关度高,容易消耗计算性能
有噪声——部分特征对预测结果有负影响

主要方法:
Filter(过滤式):VarianceThreshold 删除特征值方差小的特征
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)

过滤式

sklearn特征选择API:sklearn. decomposition

VarianceThreshold(threshold = 0.0)
删除所有低方差特征
Variance.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。
默认值是保留所有非零方差特征,即删除所有样本
中具有相同值的特征。

from sklearn.feature_selection import VarianceThreshold
import numpy as np


def vt():
    """
    删除低方差特征
    :return:None
    """
    var=VarianceThreshold(threshold=0.0)
    data=var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)


if __name__=="__main__":
    vt()

输出结果:
[[2 0]
 [1 4]
 [1 1]]
 

主成分分析PCA

本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量

sklearn降维API:sklearn. decomposition

PCA(n_components=None)
将数据分解为较低维数空间 n_components:减少到的特征数量百分数 0-1 特征减少到到90-95%最为合适
PCA.fit_transform(X)
X:
numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array

from sklearn.decomposition import PCA


def pca():
    """
    主成分分析
    :return:None
    """
    pca=PCA(n_components=0.9)
    data=pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)

if __name__=="__main__":
    pca()
    
输出结果
[[ 1.22879107e-15  3.82970843e+00]
 [ 5.74456265e+00 -1.91485422e+00]
 [-5.74456265e+00 -1.91485422e+00]]

当特征数量十分大的时候应该进行主成分分析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值