机器学习的目的与流程
目的:机器学习是从数据中自动分析获得规律(模型),并用规律对未知数据进行预测 建立模型:根据数据类型划分应用种类
原始数据明确问题要做什么 数据的基本处理:pandas去处理数据(缺失值、合并表等等) 特征工程(特征进行处理) : ? ? 分类:目标值离散型 ? ? 回归:目标值连续型 找到合适的算法进行预测 模型的评估,判断效果(上线以API形式提供) 如果没有合格 换算法 换参数 特征工程
特征工程
数据集:数据的集合
常用数据集的构成: 特征值+目标值(有些数据集可以没有目标值)
读取的工具 :pandas (基于numpy 释放了GIL锁 能采用真的多线程)
学习可用的数据集:
在机器学习的时候数据一般都是使用文件 ,因为数据库(MySql)等都可能具有一下问题:
性能瓶颈、读取速度 格式不符合机器学习的要求数据格式
特征工程概述与意义
概述:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性 意义: 最大限度地从原始数据中提取特征以供算法和模型使用。
scikit - learn 库的介绍
python语言机器学习的工具 Scikit-learn包括了许多的知名的机器学习的算法的实现 scikit-learn文档完善,容易上手,有丰富的API
sklearn 对于特征的处理提供了强大的接口 pandas 一个数据读取非常方便的工具 DataFrame 以及基本的处理数据的格式
特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
选择依据:
冗余:部分特征的相关度高,容易消耗计算性能I 噪声:部分特征对预测结果有影响
数据类型区别:
离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所 有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续 的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。
只要记住一点,离散型是区间内不可分,连续型是区间内可分
主要方法(三大武器): Filter(过滤式):VarianceThreshold、Embedded(嵌入式):正则化、决策树Wrapper(包裹式)
特征数据抽取
特征处理就是通过特定的统计学方法(数学方法)将数据转换成算法要求的数据
1.字典数据抽取:把字典中一些类别的数据,分别转化成特征 2.数组类型:有类别的特征先要转换成字典数据 PS:数据中有重复值不需要进行处理
字典数据特征
API: sklearn_feature_extraction 语法:DictVectorizer(sparse = True) sparse为True表示默认返回一个Sparse矩阵 用法:实例化DictVectorizer
from sklearn.feature_extraction import DictVectorizer dict = DictVectorizer(sparse = False) ??目的是为了返回一个ndarray的矩阵 dict.方法
方法 | 描述 |
---|
fit_transfrom(X) | X:字典或者包含字典的迭代器 返回值默认是sparse矩阵 | inverse_transfrom(X) | X:array数组或者sparse矩阵 返回之前的数据格式 | get_feature_names() | 返回类别名称 |
案例:
from sklearn.feature_extraction import DictVectorizer
def dictdec():
list = [{'city':"北京",'temperature':100},
{'city':"上海",'temperature':60},
{'city':"深圳",'temperature':30},]
dict = DictVectorizer(sparse = False)
data = dict.fit_transform(list)
print(dict.get_feature_names())
print(data)
return None
if __name__ == '__main__':
dictdec()
文本数据特征
类:from sklearn.feature_extraction.text import CountVectorizer 功能:对文本数据进行特征值化处理,可以用一段文字(词语)的频率来判断文章是什么类型 单独原因:汉字的特征化要使用另一种方法 不然就会变成一个字一个特征的情况 PS:一个字母或者一个汉字都没有分类的依据 DictVectorizer不会进行统计 目的:对文本数据进行特征值化 需求: jieba库 ??????返回词语的汉字生成器 from sklearn.feature_extraction.text import CountVectorizer库
案例:
import jieba
from sklearn.feature_extraction.text import CountVectorizer
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 hanzi():
c1,c2,c3 = cutword()
list = [c1,c2,c3]
cv = CountVectorizer()
data = cv.fit_transform(list)
print(cv.get_feature_names())
print(data.toarray())
return None
if __name__ == '__main__':
hanzi()
TF-IDE 分析问题
TF:汉字的出现频率
IDE:逆文档次数 总文档数/出现文档的次数
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
语法:
TfidfVectorizer(stop_words = None,…) 返回词的权重矩阵 tf = TfidfVectorizer() 实例化
函数名 | 介绍 |
---|
fit_transform(X) | X:文本或者文本字符串的可迭代对象 返回值默认spare矩阵 | inverse_transform(X) | X:array数据或者sparse矩阵 返回之前的数据格式 | get_feature_names() | 返回值:单词列表 |
归一化和标准化对比
sklearn归一化API:from sklearn.preprocessing import MinMaxScaler
归一化特点: 通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式: 语法:
mm = MinMaxScaler(feature_range=(2,3)) # 通过元组指定范围,实例化 通过fit_transform转换
fit_transform(x) | x:numpy array格式的数据 返回值:转换后的形状相同的array |
---|
案例:
from sklearn.preprocessing import MinMaxScaler
def mm():
list = [
[90,2,10,40],
[60,4,15,45],
[75,3,13,46]
]
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform(list)
print(data)
return None
if __name__ == '__main__':
mm()
总结: 注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。(这种场景很少) 我们一般使用标准化
sklearn标准化API:from sklearn.preprocessing import StandardScaler
特点:1、特点:通过对原始数据进行变换把数据变换到均值为0,比标准差为1范围内
公式:
语法:
std = StandardScaler() #实例化
通过fit_transform转换
fit_transform(x) | x:numpy array格式的数据 返回值:转换后的形状相同的array |
---|
mean_ | 原始数据每列特征的平均值 | std_ | 原始数据每列特征的方差 |
总结 : 适用现在的大数据场景
数值型数据的标准缩放便是归一化、标准化
数据的特征预处理
缺失数据的处理方法:(其实一般使用pandas中的方法)
删除 | 插补 |
---|
如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列 | 可以通过缺失值每列或者每行的平均值、中位数来填充 |
sklearn缺失值API:sklearn.preprocessing.Imputer
Imputer语法:
Imputer(missing_values = ‘NaN’,strategy = ‘mean’,axis =0) Imputer.fit_transform(X) X:ndarray格式的数据,返回值,转换后的形状相同的array
数据降维
维度:不是数组的维度 而是特征的数量
过滤式
特征选择三大武器之一的过滤式: 通过方差大小来考虑所有样本这个特征的数据情况
API :VarianceThreshold
语法:
初始化VarianceThreshold(x) 指定x阈值方差,将所有低于阈值的方差数据舍弃,因为他们特征值离散程度低,参考价值不大
def var():
list = [[0,2,0,3],
[0,1,4,3],
[0,1,1,3]]
var = VarianceThreshold(threshold = 1.0)
data = var.fit_transform(list)
print(data)
return None
PCA
API :from sklearn.decomposition import PCA 本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。 作用:可以削减回归分析或者聚类分析中特征的数量
适用条件:特征的数量达到上百的时候就可以考虑要不要用PCA来简化数据
结果:数据也会改变,特征也会减少 作用:消减回归分析或者聚类分析中特征的数量
PCA语法:
PCA(n_components = 0.9) 控制为90%数据保留有效值 pca.fit_transform(cross) cross是numpy_array格式的数据 返回的是指定后维度的array
案例:
import pandas as pd
from sklearn.decomposition import PCA
aisles = pd.read_csv(r"需要的数据/aisles.csv")
orders = pd.read_csv(r"需要的数据/orders.csv")
products = pd.read_csv(r"需要的数据/products.csv")
prior = pd.read_csv(r"需要的数据/order_products__prior.csv")
_mg = pd.merge(prior,products,on = ['product_id','product_id'])
_mg = pd.merge(_mg,orders,on = ['order_id','order_id'])
mt = pd.merge(_mg,aisles,on = ['aisle_id','aisle_id'])
cross = pd.crosstab(mt['user_id'],mt['aisle'])
print(cross)
pca = PCA(n_components = 0.9)
data = pca.fit_transform(cross)
print(data.shape())
|