学习笔记:机器学习day1

数据集的构成

机器学习的数据:文件CSV

mysql不适合机器学习:

  1. 性能瓶颈,读取速度
  2. 格式不太符合机器学习要求数据的格式

读取工具:

  1. pandas:读取工具
  2. numpy:快的原因:把GIL锁释放了
一、 数据集的结构

可用数据集
scikit-learn的特点:

  1. 数据量较小
  2. 方便学习

kaggle特点:

  1. 大数据竞赛平台
  2. 80万科学家
  3. 真实数据
  4. 数据量巨大

UCI特点:

  1. 收录了360个数据集
  2. 覆盖科学、生活、经济等领域
  3. 数据量几十万

常用数据集的结构组成
结构:特征值+目标值

房子面积 房子位置 房子楼层 目标值
数据 80 9 3 80

注:有些数据集科研没有目标值
机器学习:数据中的重复值不需要去重

二、特征工程

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

重要概念:

1. 数据的特征抽取(feature_extraction)

将一个文本、字符串转换成数字就是特征抽取

1.文本特征抽取

方式1(用得比较少):CountVectorizer()

  • 返回词频率矩阵
  • CountVectorizer.fit_transform(X)
    X:文本或者包含文本字符串的可迭代对象
    返回值:返回sparse矩阵
  • CountVectorizer.inverse_transform(X)
    X:array数组或者sparse矩阵
    返回值:转换之前数据格式
  • CountVectorizer.get_feature_names()
    返回值:单词列表
#导入包
from sklearn.feature_extraction.text import CountVectorizer
#实例化CountVectorizer
vector =CountVectorizer()
#调用fit_transform输入并转换数据
res = vector.fit_transform(["Life is short,I like python.","Life is long, I dislike python."])
#打印结构
print(vector.get_feature_names())
print(res.toarray())

结果输出:(单个字母不统计)

['dislike', 'is', 'life', 'like', 'long', 'python', 'short']
[[0 1 1 1 0 1 1]
 [1 1 1 0 1 1 0]]

注意:中文不支持特征文本特征抽取,需要用到jieba分词。
使用:jieba.cut
例子:

import jieba
words = '我是一个好程序员'
#分词
words_cut = jieba.cut(words)
#将词转换成列表
con = list(words_cut)
#将列表转换成字符串并用空格隔开
c1 = " ".join(con)
print(c1)
我 是 一个 好 程序员

注意:传入文本特征抽取时候要加上[]。
res = vector.fit_transform([c1])

方式2 tf-idf分析
Tf: 词的频率 term frequency

idf:逆文档频率 inverse document frequency
log(总文档数量/该词出现的文档数量)

tf * idf 反映重要性程度

TF-IDF的主要思想是:如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为该词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

类:sklearn.feature_extraction.text.TfidfVectorizer

  • TfidfVectorizer(stop_word=None,…)
    返回词的权重矩阵

  • TfidfVectorizer.fit_transform(x)
    x:文本或者包含文本字符串的可迭代对象
    返回值:返回sparse矩阵

  • TfidfVectorizer.inverse_transform(x)
    x:array数组或者sparse矩阵
    返回值:转换之前数据格式

  • TfidfVectorizer.get_feaure_names()
    返回值:单词列表

from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
data = tf.fit_transform(['life is short,i like python','life is long,i dislike python.'])
print(tf.get_feature_names())
print(data.toarray())

结果输出:(反映词的重要性)

['dislike', 'is', 'life', 'like', 'long', 'python', 'short']
[[0.         0.37930349 0.37930349 0.53309782 0.         0.37930349
  0.53309782]
 [0.53309782 0.37930349 0.37930349 0.         0.53309782 0.37930349
  0.        ]]
2.字典特征抽取

DictVectorizer(sparse = True,…)

  • DictCectorizer.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
dict = DictVectorizer()
data = dict.fit_transform([{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"广州","temperature":30}])
print(data)
print(dict.get_feature_names())

结果输出: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
  ['city=上海', 'city=北京', 'city=广州', 'temperature']

不想输出sparse矩阵格式可设置参数 dict = DictVectorizer(sparse = False)

dict = DictVectorizer(sparse=False)

结果输出:One-hot编码

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

2.数据的特征预处理

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

不同数据类型的预处理方式
数值型数据:标准缩放

  1. 归一化
  2. 标准化
  3. 缺失值

**类别型数据:**one-hot编码
**时间类型:**时间的切分

数值型数据:
1. 归一化

特点:通过对原始数据进行变换把数据映射到默认为(0-1)之间

特征同等重要的时候需要归一化处理,转换到同一标准下,再做判断。目的:使某个特征对最终结果不会造成更大影响

缺点:最大值最小值受异常点影响,鲁棒性较差,只适合传统精确小数据场景。

公式:

X = ( X m i n ) / m a x m i n X' = (X - min)/max-min
X = X ( m x m i ) + m i X'' = X'*(mx-mi) +mi
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’‘为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

API
sklearn.preprocessing.MinMaxScaler

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

例子:

from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)

2. 标准化(常用,受异常点影响较小)

在已有足够多的情况下比较稳定,适合现代嘈杂大数据场景
1.特点:通过对原始数据进行转换把数据变换到均值为0,方差为1范围内

2.公式
X = ( X m e a n ) / σ X' = (X - mean)/σ
注:作用于每一列,mean为平均分,σ为标准差
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

API
sklearn特征化API:sklearn.preprocessing.StandarScaler

StandardScaler(…)
处理之后每列来说所有数据都聚集再均值0附近标准差为1

  • StandardScaler.fit_transform(x)
    x:numpy array格式的数据[n_samples,n_features]
    返回值:转换后的形状相同的arry
  • StandardScaler.mean_
    原始数据中每列特征的平均值
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
data = std.fit_transform([[90,2,10],[60,4,15],[75,3,13]])
print(data)
print('每列均值为:',std.mean_)

输出结果:

[[ 1.22474487 -1.22474487 -1.29777137]
 [-1.22474487  1.22474487  1.13554995]
 [ 0.          0.          0.16222142]]
每列均值为: [75.          3.         12.66666667]
3. 缺失值处理方法

方法1:

  1. 删除
  2. 插补(每行或每列:平均值,中位数)

方法2:
sklearn缺失值API:from sklearn.impute import SimpleImputer

SimpleImputer(missing_values=‘NaN’, strategy=‘mean’ , axis=0)
missing_values: 指定缺失值
strategy:填补的策略

  • SimpleImputer.fit_transform(x)

x:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的arry

pandas处理:dropna或者fillna
数据当中的缺失值:np.nan
如果缺失值不是np.nan 可以用replace替换

from sklearn.impute import SimpleImputer
import numpy as np
Imputer = SimpleImputer(missing_values=np.nan,strategy='mean')
data = Imputer.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)

输出结果:

[[1. 2.]
 [4. 3.]
 [7. 6.]]

3.数据的降维

降维指的是减少特征的数量
特征选择的原因:
冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有影响

特征选择是什么
特征选择就是单纯地从提取到所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值,也可以不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

主要方法(三大武器):
filter(过滤式):Variance Threshold (从方差的大小考虑)
Embedded(嵌入式):正则化,决策树
Wrapper(包裹式)

方差过滤 API
sklearn.feature_selection.VarianceThreshold

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

示例:

from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)

结果输出:

[[2 0]
 [1 4]
 [1 1]]

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

  • PCA(n_components=None)
    n_components
    小数:保留百分之多少的信息 (90%-95%比较好)
    整数:减少到的特征数量
    将数据分解为较低维数空间
  • PCA.fit_transform(x)
    x:numpy array格式得数据[n_samples,n_features]
    返回值:转换后指定维度得array

示例:

from sklearn.decomposition import PCA
pca = PCA(n_components=0.9)
data = pca.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)

结果输出:

[[-1.76504522]
 [ 2.35339362]
 [-0.58834841]]
4.Sklearn库介绍:
  1. Classification 分类
  2. Regression 回归
  3. Clustering 聚类
  4. Dimensionality reduction 降维
  5. Model selection 模型选择
  6. Preprocessing 特征工程
5.数据类型

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

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

注:只要记住一点,离散型是区间内不可分,连续型是区间内可分

6.机器学习算法分类

监督学习(预测)(特征值+目标值)

  • 分类:k-近邻算法,贝叶斯分类,决策树与随机森林,逻辑回归,神经网络
  • 回归:线性回归,岭回归
  • 标注:隐马尔可夫模型

非监督学习(特征值)

  • 聚类:k-means
机器学习的开发流程

模型:算法+数据

  1. 数据(明确问题做什么)
  • 公司本身就有数据
  • 合作过来的数据
  • 购买的数据
  1. 数据的基本处理:pd去处理数据(缺失值,合并表…)
  2. 特征工程
  3. 找到合适的算法进行预测
  4. 模型的评估,判断效果
发布了5 篇原创文章 · 获赞 5 · 访问量 137

猜你喜欢

转载自blog.csdn.net/Rick_Restart/article/details/105615164
今日推荐