机器学习概述、特征工程、机器学习算法
一、什么是机器学习
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。
二、数据类型
- 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
- 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。
(注:离散型是区间内不可分,连续型是区间内可分)
三、常用数据集数据的结构组成
结构:特征值+目标值
四、数据的特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。直接影响模型的预测结果。
五、特征抽取
1、字典特征抽取
语法:DictVectorizer(sparse=True,…)
- DictVectorizer.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
def dictvec():
"""
字典数据抽取
:return: None
"""
# 实例化
dict = DictVectorizer(sparse=False)
# 调用fit_transform
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(data)
print(dict.get_feature_names())
print(dict.inverse_transform(data))
return None
2、对文本进行特征值化
作用:对文本数据进行特征值化
语法:CountVectorizer(max_df=1.0,min_df=1,…)返回词频矩阵
- CountVectorizer.fit_transform(X,y) (X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵)
- CountVectorizer.inverse_transform(X) (X:array数组或者sparse矩阵 返回值:转换之前数据格式)
- CountVectorizer.get_feature_names() (返回值:单词列表)
改进:TF-IDF:如果某个词或短语在一篇文章中出现的概率高, 并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
语法:TfidfVectorizer(stop_words=None,…)返回词的权重矩阵
- TfidfVectorizer.fit_transform(X,y) (X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵)
- TfidfVectorizer.inverse_transform(X) (X:array数组或者sparse矩阵 返回值:转换之前数据格式)
- TfidfVectorizer.get_feature_names() (返回值:单词列表)
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer #出现次数,频率
import 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
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、归一化 2、标准化 3、缺失值
- 类别型数据:one-hot编码
- 时间类型:时间的切分
1、归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:
(注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’ 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0。)
语法:MinMaxScalar(feature_range=(0,1)…)每个特征缩放到给定范围(默认[0,1])
- MinMaxScalar.fit_transform(X) (X:numpy array格式的数据[n_samples,n_features] ,返回值:转换后的形状相同的array)
归一化总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。
2、标准化
语法:StandardScaler(…)处理之后每列来说所有数据都聚集在均值0附近方差为1
- StandardScaler.fit_transform(X,y) (X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array)
- StandardScaler.mean_ (原始数据中每列特征的平均值)
- StandardScaler.std_ (原始数据每列特征的方差)
标准化总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
3、缺失值插补
语法:Imputer(missing_values='NaN', strategy='mean', axis=0)完成缺失值插补
- Imputer.fit_transform(X,y) (X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array)
from sklearn.preprocessing import MinMaxScaler, StandardScaler, Imputer
import numpy as np
def mm():
"""
归一化处理
:return: NOne
"""
mm = MinMaxScaler(feature_range=(0, 1)) #归一到(0,1)
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
def stand():
"""
标准化缩放
:return:
"""
std = StandardScaler()
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
return None
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
七、降维-特征选择
1、原因:
- 冗余:部分特征的相关度高,容易消耗计算性能
- 噪声:部分特征对预测结果有负影响
2、特征选择是什么
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征, 特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯 定比选择前小,毕竟我们只选择了其中的一部分特征。
3、主要方法(三大武器)
- Filter(过滤式):VarianceThreshold
- Embedded(嵌入式):正则化、决策树
- Wrapper(包裹式)
4、Filter(过滤式):VarianceThreshold
语法:VarianceThreshold(threshold = 0.0) 删除所有低方差特征
- Variance.fit_transform(X,y) X:numpy array格式的数据[n_samples,n_features],返回值:训练集差异低于threshold的特征将被删除。 默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
def var():
"""
特征选择-删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
if __name__ == "__main__":
var()
八、降维-主成分分析(PCA)
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
语法:PCA(n_components=None) 将数据分解为较低维数空间
- PCA.fit_transform(X) (X:numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array)
from sklearn.decomposition import PCA
def pca():
"""
主成分分析进行特征降维
:return: None
"""
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None
if __name__ == "__main__":
pca()
九、机器学习算法分类
监督学习:输入数据有特征有标签,即有标准答案。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值 (称为回归),或是输出是有限个离散值(称作分类)。
- 分类 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
- 回归 线性回归、岭回归
- 标注 隐马尔可夫模型 (不做要求)
无监督学习:输入数据有特征无标签,即无标准答案。可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成。
- 聚类 k-means