总的来说,机器学习是从数据自动分析获得规律(模型),并利用规律对未知数据进行预测

一.数据集的结构

机器学习的数据,大多数都是存在csv文件里,而不是数据库。原因:

  • 因为数据库容易有性能瓶颈,读取速度慢。
  • 数据库的数据格式不太符合机器学习要求数据的格式。

可用数据集:

  • scikit_learn:这个库自带轻量数据集,数据量小,方便学习
  • kaggle:竞赛平台,真实数据,数据量巨大
  • UCI:涉及比较专业的领域,覆盖科学、生活、经济等领域,

常用数据集的结构组成:

特征值+目标值

二.特征工程

数据中对特征值的处理:

  • pandas:读取数据以及基本的处理格式。
  • scikit-learn:对于特征的处理提供了强大的接口。

特征工程的定义

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

sciket-learn库

python机器学习工具;包含了许多知名的机器学习算法的实现;文档完善,易于上手。

三.特征数据抽取

特征抽取:对文本数据转化为数字。

API:sklearn.feature_extraction

1.字典特征抽取

API:sklearn.feature_extraction.DictVextorize(sparse=True)

sparse矩阵可以用scipy库进行处理,具有节约内存方便读取的有点,但是我们一般要处理ndarray矩阵,也不会去用scipy库,因此实例化时,要设置sparse=False

a.实例化类DictVectorizer:

from sklearn.feature_extraction import DictVectorizer

# 实例化
dict = DictVectorizer(sparse=False)

类中所含有的方法:

  • DictVectorizer.fit_transform(X)
    • X:字典 或 包含字典的迭代器
    • 返回值:默认sparse数据,指定sparse=False后返回ndarray矩阵
  • DictVectorizer.inverse_transform(X)
    • X:array数组 或者 sparse矩阵
    • 返回值:转换之前的数据格式
  • DictVectorizer.get_feature_names()
    • 返回类别名称
  • DictVectorizer.transform(X)
    • 按照原先的标准转换

b.使用fit_transform(X)方法转换数据

注:字典数据外层要包在列表里。

# 调用fit_transform转化数据
s = [{'city': '北京', 'temperature': 100},
     {'city': '上海', 'temperature': 80}]
data = dict1.fit_transform(s)

print(data)     # 查看转换后的数据

返回ndarray矩阵。

2.文本数据特征抽取

API:sklearn.feature_extraction.text.CountVectorizer()

注:该类没有sparse参数。只能在后面的调用fit_transform(X)后加上 .toarray()函数把sparse转化成array

a.实例化类CountVectorizer:

from sklearn.feature_extraction.text import CountVectorizer

# 实例化
dict1 = CountVectorizer()

类中含有的方法:

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

b.使用fit_transform(X)方法转换数据

# 调用fit_transform转化数据
s = ['qqq 123',
     'aaa',
     '111'
     'qqq 123']
data = cv.fit_transform(s).toarray()  #要加上toarray()函数转化成array数组

print(data)  # 查看转换后的数据

统计所有文章当中所有的词,重复的字符串只看作一次。

对单个英文字母不统计:因为没有分类依据(对单个字母统计也没有什么意义)。

字符串里,每个重复的单词会在相应位置+1。对于中文,普通中文句子没有单词分割,不支持这种单词统计。进行空格分开中文句子,才能进行单词统计。

  • 中文分割单词:用jieba库。

3.tf-idf分析问题

tf-idf的只要思想:如果某个词在一篇文章出现的频率高,在其他文章出现的频率较低,则认为该词具有很好的类别区分能力,适合用来分类。

比如要看两篇文章是否属于同一类别,如果只是看他们的所有单词的占比,肯定不行,因为公共词的出现频率高其他单词很多,能判断类型的单词出现的频率低。因而,我们需要用tf-idf来分析问题。

  • tf:term frequency -- 词频
  • idf: 逆文档词频—— 公式:log(总文档数/该词出现的文档数量)

单词的重要性 = tf * idf

通过该公式计算,公共词的重要性就降低了,我们比较重要性高的词汇就能判断是否是同一类别。

代码实现:

API:sklearn.feature_extraction.text.TfidfVectorizer()

和上面的CountVectorizer类用法完全一致

from sklearn.feature_extraction.text import TfidfVectorizer

# 实例化
cv = TfidfVectorizer()

# 调用fit_transform转化数据
s = ['qqq 123',
     'aaa',
     '111'
     'qqq 123']
data = cv.fit_transform(s).toarray()

print(data)  # 查看转换后的数据

可以看到,输出的结果是每个单词的重要性。

四.特征预处理

1.缺失值处理

缺失值处理一般使用pandas处理,之后pandas在进行介绍,这里主要了解一下缺失值处理的思想。

缺失值两种处理方法,要么删,要么补。

sklearn缺失值API:sklearn.preprocessing.Imputer

  • Imputer(missing_values='nan', stratege='mean', axis=0)
    • stratege:具体的填补策略,需要其他的再去找
    • axis:默认是0,按列
    • 完成缺失值处理
  • Imputer.fit_transform(X)
    • X:array格式的数据
    • 返回值:转换后形状相同的array

注:不管在pandas还是sklearn中的处理,都要求缺失值是np.nan,如果是其他形式,需要用pandas里的replace方法换成np.nan

2.标准缩放(归一化/标准化)

a.归一化(不常用)

计算公式与介绍:

归一化:把数据进行缩放。

什么时候需要归一化?多个特征同等重要的时候。因为不归一化每个特征的标准不同,难以进行对比评价。而且,比如在k近邻算法中,涉及不同目标的特征之间做差再平方求和,如果不进行归一化,比如出现:(7000-4000)² + (10-7)²,显然数值大的特征对结果的影响更大,这不是我们想要的。

如果异常值很多,对归一化结果有什么影响?异常值对最大值最小值影响特别大,导致对归一化的结果影响也很大。

总结:结果容易受异常值影响,这种方法鲁棒性(稳定性)较差,只适合传统精确小数据的场景。(适合用归一化的场景很少,基本用不到;广泛使用的是下面的标准化)

代码:

归一化API:skleaen.preprocessing.MinMaxScaler

类中所含有的方法:

  • MinMaxScaler(feature_range=(0,1)...)
    • 每个特征缩放到给定范围,默认(0,1)
    • 返回值:默认sparse数据,指定sparse=False后返回ndarray矩阵
  • MinMaxScaler.fit_transform(X)
    • X:array数组
    • 返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler

# 实例化
mm = MinMaxScaler((0, 10))

# 调用fit_transform转化数据
s = np.array(([10, 8, 34],
              [40, 5, 1],
              [90, 2, 75]))
data = mm.fit_transform(s)

print(data)  # 查看转换后的数据

b.标准化(广泛使用)

计算公式与介绍

作用和归一化一样,把同等重要的特征的数值缩放成一样的标准。

由于计算公式不是用最大值和最小值,而是用平均值。当数据量大的时候,异常值对平均值的影响不大,方差改变也较小,因此标准化在样本足够过时比较稳定,适合大数据。

代码:

标准化API:skleaen.preprocessing.StandardScaler

类中所含有的方法:

  • StandardScaler()
    • 注:不能再用参数指定缩放范围。标准化后的数据都是集中均值为0附近,方差为1
  • StandardScaler.fit_transform(X)
    • X:array数组
    • 返回值:转换后的形状相同的array
  • StandardScaler.mean_
    • 原始数据每列特征的平均值
  • StandardScaler.std_
    • 原始数据每列特征的方差
from sklearn.preprocessing import StandardScaler

# 实例化
std = StandardScaler()

# 调用fit_transform转化数据
s = np.array(([10, 8, 34],
              [40, 5, 1],
              [90, 2, 75]))
data = std.fit_transform(s)

print(data)  # 查看转换后的数据

3.数据降维(特征选择/主成分分析)

有些特征对目标值

a.特征选择

为什么要特征选择?部分特征的相关度高;部分特征会导致预测结果偏差。

特征选择过程:从所有特征中选择部分特征作为训练集,选择前后可以改变值,也可以不改变值。

特征选择的方法:常用的有过滤式、嵌入式、神经网络。嵌入式在后面正则化、决策树等算法中讲,这里主要讲过滤式

过滤式特征选择

过滤式特征选择主要用方差大小来考虑每个特征值的重要性。删除方差小的特征。

API:sklearn.feature_selection.VarianceThreshold

  • VarianceThreshold(threshold=0.0)
    • 删除所有低于该指定方差的特征
  • VarianceThreshold.fit_transform(X)
    • X:array格式的数据
    • 返回值:删除后的array数据
from sklearn.feature_selection import VarianceThreshold

# 实例化
var = VarianceThreshold(1)

# 调用fit_transform转化数据
s = np.array(([1, 10, 8],
              [1, 40, 10],
              [0, 9, 7]))
data = var.fit_transform(s)

print(data)  # 查看转换后的数据

注:一般删除的方差取0~10,具体取值根据算法的优劣。

b.主成分分析(特征达到上百个的时候才用)

本质:采用PCA分析技术,尽可能简化降低原数据的维数,保留的数据可能也会改变。

特征少的时候最好自己分析,特征上百个的时候才用主成分分析。

API:sklearn.decomposition.PCA

  • PCA(n_components=None)
    • 参数n_components:
      • 小数:可填0~1,比如 0.9 表示90%的信息(一般填 0.9~0.95 效果最好)
      • 整数:减少到的特征数量(一般不适用这个,我们没办法自己确定减少到的数量)
  • PCA.fit_transform(X)
    • X:array数据类型
    • 返回值:转换后指定维度的array

代码用法和上面都是一样的,就不再列出了。

五.sklearn数据集

1.sklearn数据集接口

sklearn数据集API:sklearn.datasets

两种数据集:

  • datasets.load_*()
    • 获取小规模数据集,数据包含在datasets中
  • dataset.fetch_*(data_home=None, subset="train")
    • 获取大规模数据集,需要从网络下载。
    • 参数data_home:指定下载的目录,默认是:~/scikit_learn_data
    • 参数subset:指定获取训练集"train",测试集"test",全部"all",默认获取train,一般获取全部,自己再去分。

获得的数据集类型是 一种字典,可以用下面的属性来获取相应的值。

  • data:特征数据array数组,是[n_samples * n_features]的二维数组。
  • target:标签数组,是n_samples的一维数组。
  • DESCR:数据描述
  • feature_names:特证名(新闻数据、手写数字、回归数据等没有特征名)
  • target_names:标签名

如:


# load_*获取小数据
from sklearn.datasets import load_iris

li = load_iris()

print("获取特征值 :\n", li.data)
print("获取目标值:\n", li.target)
print("获取描述:\n", li.DESCR)

2.数据集划分

机器学习中用来训练模型的数据不能再用于训练结果评估,不然训练就没什么意义了。因此数据划分为两类:训练集 和 测试集。

一般训练集和测试集比例 7.5 :2.5 (经过测试,这个比例的效果最好)。

数据划分API:sklearn.model_selection.train_test_split(*arrays, **options)

  • test_size:测试集的大小,小数表示百分比(0.75表示75%)
  • random_state:随机数种子。不同的种子会造成不同的随机采样结果,相同的种子采样结果相同。

注:返回值即包含训练集,也包含测试集,我们可以用四个参数来接受(顺序不能乱)

x:特征值,y:目标值。返回结果的先后顺序为x_train(训练集特征值),x_test(测试集特征值),y_train(训练集目标值),y_test(测试集目标值)

如:划分获取的load_iris数据集

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

li = load_iris()

x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.75)

print("训练集特征值和目标值:", x_train, "\n", y_train)
print("测试集特征值和目标值:", x_test, "\n", y_test)

六.估计器

1.几+个估计器API

用于分类的估计器

  • sklearn.neighbors: k近邻
  • sklearn.naive_baues:贝叶斯
  • sklearn.linear_model.LogisticRegression:逻辑回归
  • sklearn.tree:决策树与决策森林

用于回归的估计器

  • sklearn.linear_model.LinearRegression:线性回归
  • sklearn.linear_model.Ridge:岭回归

2.用法

首先区别一下fit()和前面用的fit_transform(),fit()只是用相应API进行计算,对原数组不做修改,transform()是在计算后对原数组进行修改并返回修改结果,而fit_transform()相当于fit()+transform()。估计器这里我们调用fit()即可

x:特征值,y:目标值

  • 输入训练集数据,调用fit(x_train, y_train)
  • 输入测试集数据 x_test, y_test
  • 两个API:
    • 获得预测值:y_predict = predict(x_test)
    • 得出预测的准确率:score = score(x_test, y_test)