机器学习算法基础1-机器学习概述、特征工程

 

目录

人工智能,机器学习,深度学习

数据来源与类型

数据来源

数据类型

数据的特征工程

Scikit-learn

数据的特征抽取

字典特征抽取

文本特征抽取

对中文分词,需要使用jieba库

TfidfVectorizer语法

数据特征预处理

  1、归一化

2、标准化

   3、缺失值


人工智能,机器学习,深度学习

人工智能的研究领域也在不断扩大,上图展示了人工智能研究的各个分支,包括专家系统、机器学习、进化计算、模糊逻辑、计算机视觉、自然语言处理、推荐系统等。

机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。机器学习可以解放生产力,解决专业问题,提供社会便利。应用场景有自然语言处理,计算机视觉,无人驾驶,推荐系统。

深度学习本来并不是一种独立的学习方法,其本身也会用到有监督和无监督的学习方法来训练深度神经网络。但由于近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),因此越来越多的人将其单独看作一种学习的方法。

 

数据来源与类型

数据来源

企业日益积累的大量数据(互联网公司更为显著),政府掌握的各种数据,科研机构的实验数据。

数据类型

机器学习的数据:文件csv

mysql存在性能瓶颈,读取速度慢,格式不太符合机器学习要求的格式。从而需要pandas,numpy。

离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。

连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。

常见数据集有 scikit-learn,Kaggle,UCI 。结构:特征值+目标值。例如房子面积,位置等等是特征,目标值,由特征去分类,最终得到的结果值,特征值影响目标值。

注:机器学习中,如果出现重复值,不需要去重处理。

数据的特征工程

特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。简而言之,就是对特征进行处理的过程。

Scikit-learn

Python语言的机器学习工具Scikit-learn包括许多知名的机器学习算法实现Scikit-learn文档完善,容易上手,丰富API,使其在学术界颇受欢迎目前稳定版本0.18。

数据的特征抽取

机器学习首先将某些特征转化为相应的数据。再由数据去进行分类以及其他处理。比如对文章,新闻的特征抽取。

字典特征抽取

字典数据进行特征值化,类:sklearn.feature_extraction.DictVectorizer。

DictVectorizer . fit_transform (X)      
X: 字典或者包含 字典的迭代器
返回值:返回 sparse 矩阵
DictVectorizer . inverse_transform (X)
X:array 数组或者 sparse 矩阵
返回值 : 转换之前数据格式
DictVectorizer.get_feature_names ()
返回类别名称
DictVectorizer.transform (X)
按照原先的标准转换
 
#字典特征数据抽取
def dictvec():
    """
    字典抽取数据
    :return: None
    """
    #实例化DictVectorizer类
    dict=DictVectorizer(sparse=False)

    #调用fit_transform  调用fit_transform方法输入数据并转换  返回的是sparse矩阵            
    data=dict.fit_transform([{'city':'北京','temperature':100},
                        {'city':'上海','temperature':60},
                        {'city':'深圳', 'temperature':30}
])
    print(dict.get_feature_names())#由特征值转向原来的值

    print(dict.inverse_transform(data))#特征和对应的值

    print(data)


    return None
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

文本特征抽取

文本特征抽取将文本转化为特征值。

CountVectorizer

CountVectorizer . fit_transform ( X,y )      
X: 文本或者包含 文本字符串的可迭代对象
返回值:返回 sparse 矩阵
CountVectorizer . inverse_transform (X)
X:array 数组或者 sparse 矩阵

返回值:转换之前数据格式

CountVectorizer.get_feature_names ()
 
def countvec():
    """
    对文本进行特征值化

    :return:None
    """
    cv=CountVectorizer()

     #分词(按空格)
    data=cv.fit_transform(["life is is short,i like python","life is too long,i dislike python"])

    print(cv.get_feature_names())#统计所有文章中的词 ,重复的只出现一次。单个字母不统计

    print(data.toarray())#转化成数组形式

    return None

对中文分词,需要使用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 hanzivec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()

    print(c1, c2, c3)

    cv = CountVectorizer()

    data = cv.fit_transform([c1, c2, c3])

    print(cv.get_feature_names())#统计所有文章中的词 ,重复的只出现一次。

    print(data.toarray())#转化成数组形式

    return None

TfidfVectorizer语法

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,

并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分

能力,适合用来分类。

TfidfVectorizer . fit_transform ( X,y )      
X: 文本或者包含 文本字符串的可迭代对象
返回值:返回 sparse 矩阵
TfidfVectorizer . inverse_transform (X)
X:array 数组或者 sparse 矩阵

返回值:转换之前数据格式

TfidfVectorizer .get_feature_names ()
返回值 : 单词列表
 
tf (term frequency词的频率) idf(逆文档频率inverse document frequency log(总文档数/该词出现的文档数量))tf* idf=重要程度 。
 
def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()

    print(c1, c2, c3)

    tf = TfidfVectorizer()

    data = tf.fit_transform([c1, c2, c3])

    print(tf.get_feature_names())#统计所有文章中的词 ,重复的只出现一次。

    print(data.toarray())#转化成数组形式

    return None

 

数据特征预处理

 
特征处理的方法
通过 特定的统计方法(数学方法) 数据 转换成 算法要求的数据。
 

数值型数据:标准缩放:

  1、归一化

通过对原始数据进行变换把数据映射到(默认为[0,1])之间。目的使一个特征不会对结果造成更多干扰。

MinMaxScalar(feature_range=(0,1))

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

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

2、标准化

通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。

方差为0 ,表示特征一样,方差越大,数据越分散,越小,越集中。

对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

 

StandardScaler ( )
处理之后每列来说所有数据都聚集在 均值 0 附近方差为 1
StandardScaler . fit_transform ( X,y )      
X:numpy array 格式 的数据 [ n_samples,n_features ]
返回值:转换后的形状相同的 array
StandardScaler.mean _
原始数据中每列特征的平均值
StandardScaler.std _
原始数据每列特征的方差

def stand():
    """
    标准化缩放
    :return:
    """
    std = StandardScaler()

    data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])

    print(data)

    return None

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

 

   3、缺失值

删除

如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列

插补

可以通过缺失值每行或者每列的平均值、中位数来填充

 

Imputer( missing_values='NaN' strategy='mean' axis=0 )
完成缺失值插补

 

Imputer . fit_transform ( X,y )      
X:numpy array 格式 的数据 [ n_samples,n_features ]
返回值:转换后的形状相同的 array
 
 

1、初始化Imputer,指定缺失值,指定填补策略,指定行或列

2、调用fit_transform

def im():
    """
    缺失值处理
    :return:NOne
    """
    # NaN, nan
    im = Imputer(missing_values='NaN', strategy='mean', axis=0)

    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])

    print(data)

    return None

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值