机器学习算法基础–第一天

2163-王同学

发表文章数:35

首页 » 数据结构 » 正文

机器学习基础概念

  • 机器学习:从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
  • 数据集
    数据集的数据结构组成:特征值+目标值

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

  • 数据处理工具
    1.pandas:一个数据读取非常方便以及基本的处理格式的工具
    2.sklearn:对于特征处理提供了强大的接口
    sk-learn包括许多知名的机器学习算法的实现

  • 特征工程:将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性
    特征工程的步骤:
    1.数据特征抽取
    2.数据特征预处理
    3.数据特征选择

特征抽取

  • 特征抽取对文本等数据进行特征值化–为了让机器更好的理解数据

字典特征抽取

  • 目的:对字典数据进行特征值化
  • DictVectorizer
    1.DictVectorizer.fit_transform(X)
    (1).X为字典或者包含字典的迭代器
    (2).返回值:返回sparse矩阵,sparse节约内存,方便读取处理
    2.DictVectorizer.inverse_transform(X)
    (1).X:array数组或者sparse矩阵
    (2).返回值:转换之前数据格式
    3.DictVectorizer.get_feature_names_out()
    (1).返回类别名称
    4.DictVectorizer.transform(X)
    (1).按照原先的标准转化
    使用:
def dictvec():
    """
    字典数据抽取
    :return:
    """
    #实例化,默认sparse为True
    dict = DictVectorizer()
    #调用fit_transform
    data = dict.fit_transform(([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'广州','temperature':30}]))
    #获取类别名称
    print(dict.get_feature_names_out())
    print('这是sparse矩阵:/n',data)

    #实例化,将sparse设置为False
    dict = DictVectorizer(sparse=False)
    data = dict.fit_transform(([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'广州','temperature':30}]))
    print('这是ndarray类型:/n', data)
    return  None


if __name__ == '__main__':
    dictvec()

输出:

['city=上海' 'city=北京' 'city=广州' 'temperature']
这是sparse矩阵:
   (0, 1)  1.0
  (0, 3)   100.0
  (1, 0)   1.0
  (1, 3)   60.0
  (2, 2)   1.0
  (2, 3)   30.0
这是ndarray类型:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

Process finished with exit code 0

上述以ndarray输出的为one-hot编码形式

文本特征抽取

默认是不能对中文进行特征抽取,如要要对中文进行抽取,首先得对中文进行分词,可使用jieba分词

  • 目的:对文本数据进行特征值化
    :sklearn.feature_extraction.text.CountVectorizer
    1.CountVectorizer.fit_transform(X)
    (1).X:文本或者包含文本字符串的可迭代对象
    (2).返回值:返回sparse 矩阵
    2.CountVectorizer.inverse_transform(X)
    (1).X:array数组或者sparse矩阵
    (2).返回值:转换之前数据格式
    3.CountVectorizer.get_feature_names()
    (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(data)
    print(data.toarray())
    print(cv.get_feature_names_out())
    return None


if __name__ == '__main__':
    countvec()

输出:

  (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]]
['dislike' 'is' 'life' 'like' 'long' 'python' 'short' 'too']

TF-IDF

  • TF:词频
  • IDF:逆文档频率,log(总文档数量/该词出现的文档数量)
  • TF-IDF的主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分来,故用以评估一字词对于一个文件集或一个语料库中的其种一份文件的重要程度
  • TfidfVectorizer()方法,返回词的权重矩阵

使用:

from sklearn.feature_extraction.text import TfidfVectorizer
import  jieba

def cutword():

    con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")

    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")

    con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")

    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # 吧列表转换成字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1, c2, c3
def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1,c2,c3 = cutword()
    tf = TfidfVectorizer()
    print(tf.fit_transform([c1,c2,c3]))
    print(tf.get_feature_names_out())


if __name__ == '__main__':
    tfidfvec()

输出:

  [[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]
['一种' '不会' '不要' '之前' '了解' '事物' '今天' '光是在' '几百万年' '发出' '取决于' '只用' '后天' '含义'
 '大部分' '如何' '如果' '宇宙' '我们' '所以' '放弃' '方式' '明天' '星系' '晚上' '某样' '残酷' '每个'
 '看到' '真正' '秘密' '绝对' '美好' '联系' '过去' '这样']

Process finished with exit code 0



特征处理

  • 通过特定的统计方法(数学方法)将数据转换成算法要求的数据

三种数据类型的处理:
1.数值型数据:
标准缩放:
(1).归一化
(2).标准化
(3).缺失值
2.类别型数据:one-hot编码
3.时间类型:时间的切分
sklearn特征处理APIsklearn.preprocessing

归一化

  • 目的:使得某一个特征对最终结果不会造成更大的影响

  • 特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
    公式

    X

    =

    x

    m

    i

    n

    m

    a

    x

    m

    i

    n

    X' = /frac{x-min}{max-min}

    X=maxminxmin

    X

    =

    X

    (

    m

    x

    m

    i

    )

    +

    m

    i

    X''=X'*(mx-mi)+mi

    X=X(mxmi)+mi
    ps.作用于每一列,max为一列的最大值,min为一列的最小值,

    X

    X''

    X为最终结果,mx,mi分别为指定区间值,默认mx为1,mi为0.

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

  • 命令:MinMaxScalar(feature_range(0,1)…)
    使用:

from sklearn.preprocessing import MinMaxScaler


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




if __name__ == '__main__':
    mm()


输出:

[[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

Process finished with exit code 0

标准化

  • 特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内.如果出现异常点,由于具有一定数据量,少量的异常点对于平均值影响并不大,从而方差改变较小
  • 公式

    X

    =

    x

    m

    e

    a

    n

    σ

    X'=/frac{x-mean}{/sigma}

    X=σxmean

    v

    a

    r

    =

    (

    x

    1

    m

    e

    a

    n

    )

    2

    +

    (

    x

    2

    m

    e

    a

    n

    )

    2

    +

    .

    .

    .

    n

    (

    )

    var=/frac{(x1-mean)^2+(x2-mean)^2+…}{n(每个特征样本数)}

    var=n()(x1mean)2+(x2mean)2+...
    ps.作用于每一列,mean为平均值,

    σ

    /sigma

    σ为标准差,

    v

    a

    r

    var

    var为方差,

    σ

    =

    v

    a

    r

    /sigma = /sqrt{var}

    σ=var
    方差是考量数据的稳定性

  • 命令:StandardScaler()

1.StandardScaler.mean_→原始数据每列特征的平均值
2.StandardScaler.var_→原始数据每列特征的方差

使用:

from sklearn.preprocessing import StandardScaler


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




if __name__ == '__main__':
    Std()

输出:

[[-1.06904497 -1.29777137  0.98058068]
 [-0.26726124  0.16222142  0.39223227]
 [ 1.33630621  1.13554995 -1.37281295]]

Process finished with exit code 0

sklearn-缺失值处理

  • 方法:Imputer(missing_values=,strategy=,axis=0)
  • miss_values:指定缺失值,strategy:填补策略,axis=0默认为列

未经允许不得转载:作者:2163-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《机器学习算法基础–第一天》 发布于2021-10-12

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录