机器学习

数据集

作用:

用来训练模型

学习阶段可以用的数据集:
1)sklearn
2)kaggle
3)UCI

sklearn数据集

    1.  sklearn小数据集
        sklearn.datasets.load_iris()
       2.  sklearn大数据集
           sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
       3.  数据集的返回值

datasets.base.Bunch(继承自字典)

获取到的数据集,都需要划分为训练和测试数据集,前者用来训练模型,后者用来评估模型的训练效果。

其他

  • random_state 随机数种子。random_state就是为了保证程序每次运行都分割(得到)一样的训练集和测试集。

  • 数据集划分:

  • 训练集:用来训练,构建模型

  • 测试集:在模型检验时使用,用于评估模型是否有效。相比训练集,数据量要小。

  • 特征值: 一个元祖,包含多少行,有多少特征

 def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    # 获取数据集
    iris = load_iris()
    # print("鸢尾花数据集:\n", iris)
    # print("查看数据集描述:\n", iris["DESCR"])
    # print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值:\n", iris.data, iris.data.shape) # 获取数据集和特征值。
    # 数据集划分 训练集特征值,测试集特征值,训练集目标值,测试集目标值
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)
    return None

特征工程

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

过程包含了特征提取/抽取、特征构建、特征选择等模块。

特征提取

定义:

​ 百科:对某一模式的组测量值进行变换,以突出该模式具有代表性特征的一种方法。

​ 通俗: 将数据集数字化,然后提取其中的特征的一种方法。

实现方式:

机器学习算法是特征提取的实现途径。

机器学习来源于统计学中的方法,其本质是一堆数据公式。

  1. 文本类型 -》 数值
  2. 类型 -》 数值

字典特征提取

字典特征提取,主要做了两件事:将文本转换成类别,再将类别转换成one-hot编码。

其他:

sklearn.feature_extraction.DictVectorizer(sparse=True,…)

sparse=True,编码后返回的是一个稀疏矩阵的对象,如果要使用一般要调用toarray()方法转化成array对象。若将sparse参数设置为False,则直接生成array对象,可直接使用。

返回sparse矩阵
sparse稀疏
将非零值 按位置表示出来
节省内存 - 提高加载效率
应用场景:
1)pclass, sex 数据集当中类别特征比较多
1、将数据集的特征 -》字典类型
2、DictVectorizer转换
2)本身拿到的数据就是字典类型

from sklearn.feature_extraction import DictVectorizer
import sys

sys.path.append('./')

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer()
    print("transfer:",transfer)
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print(data_new)
    print("data_new:\n", data_new.toarray(), type(data_new))
    print("特征名字:\n", transfer.get_feature_names())
    return None

if __name__ == '__main__':
    dict_demo()

文本信息提取

单次 作为 特征。中文使用jieba 第三方库进行分词。

实现方式:

CountVectorizer
  • stop_words=[] 停用词表,参数中列出的值,将不会统计在特征值中。可使用第三方机构的停用词表,也可手动指定。

简单示例

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
res = vectorizer.fit_transform(["I love you, but you no love me"])
print(res.toarray())  # 以二维数组的形式进行展示,每个数组代表关键词在该行出现的次数
print("特征名字:\n", vectorizer.get_feature_names())

中文示例

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))

def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["一种", '不会', "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None


if __name__ == '__main__':
    count_chinese_demo2()

TF-IDF特征抽取

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba


def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))



def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

if __name__ == '__main__':
    tfidf_demo()

特征预处理

定义:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程。

归一化

  • 定义: 通过对原始数据进行变换把数据映射到(默认为【0,1】之间)。目的是为了方便后面机器学习。

  • 公式: X’ = x - mean / å 作用于每一列,mean为平均值,å为标准差。

  • 不足:若存在异常值(最大值、最小值),计算结果偏差较大。

image

from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import sys
sys.path.append('./')
def cut_word(text):
    return " ".join(list(jieba.cut(text)))

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("./dating.txt")
    data = data.iloc[:, :3]  # 获取每一行,前三列
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

if __name__ == '__main__':
    minmax_demo()

标准化

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

  • 计算公式: (x- mean)/å 作用于每一列,mean 是均值, å是均差。

from sklearn.preprocessing import StandardScaler
import jieba
import pandas as pd
import sys
sys.path.append('./')

def stand_demo():
    """
    标准化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("./dating.txt")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = StandardScaler()

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None
if __name__ == '__main__':
    stand_demo()

过滤低方差特征

from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import jieba
import pandas as pd
import sys
sys.path.append('./')

def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("./机器学xiday1资料/02-代码/factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = VarianceThreshold(threshold=10)

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new, data_new.shape)

    # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("相关系数:\n", r1)
    r2 = pearsonr(data['revenue'], data['total_expense'])
    print("revenue与total_expense之间的相关性:\n", r2)

    return None


if __name__ == '__main__':
    variance_demo()

主成分分析(降维)

定义: 高纬度转化为低纬度数据的过程,在此过程中可能会舍弃原有数据、创造新的变量

作用: 是数据维数压缩,尽可能降低元数据的维度(复杂度),损失少量信息。

应用: 回归分析或者聚类分析中。

image

sklearn.decomposition.PCA(n_components=0.95)

  • n_components 是小数时:表示保留百分之多少的信息;整数:减少到多少特征
from sklearn.decomposition import PCA
import sys
sys.path.append('./')

def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]

    # 1、实例化一个转换器类
    transfer = PCA(n_components=0.95)

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

if __name__ == '__main__':
    pca_demo()
posted @ 2021-08-14 12:14  Tank-Li  阅读(53)  评论(0)    收藏  举报