文章目录
引入:什么是机器学习?
一、数据集
(1).数据类型
①离散型数据:
由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
②连续型数据:
变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。
(2)数据集
①可用数据集
②数据集数据的结构
结构:特征值+目标值(注:有些数据集可以没有目标值)
注:可将该例中目标值看作预测房价
二、数据的特征工程
特征工程的意义:直接影响模型的预测结果
Scikit-klearn库的介绍及安装:
安装前提:需要numpy,pandas库
1.数据的特征抽取
特征抽取导包:from sklearn.feature_extraction
(1)字典特征抽取:
把字典中一些类别数据,分别进行转换成特征
类:from sklearn.feature_extraction import DictVectorizer
作用:对字典数据进行特征值化
DictVectorizer语法:DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)
# X:字典或者包含字典的迭代器
# 返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
# X:array数组或者sparse矩阵
# 返回值:转换之前数据格式
DictVectorizer.get_feature_names()
# 返回类别名称
DictVectorizer.transform(X)
# 按照原先的标准转换
流程:1.实例化类DictVectorizer
dict = DictVectorizer()
dict = DictVectorizer(sparse=False)
2.调用fit_transform方法输入数据并转换(注意返回格式)
data = dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
3.使用DictVectorizer.get_feature_names()
方法:
# 实例化
dict = DictVectorizer()
# 调用fit_transform
data = dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
print(dict.get_feature_names())
在sparse默认情况dict = DictVectorizer() 下为True的结果:返回sparse矩阵
优点:节约内存,方便读取处理
dict = DictVectorizer(sparse=False)情况下:ndarray,二维数组
其中的
为one-hot编码:
(2)文本特征抽取:方式①(常用)
类:sklearn.feature_extraction.text.CountVectorizer
CountVectorizer语法: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()
# 返回值:单词列表
# 统计所有文章中所有的词,重复的只看做一次
# 单个字母不统计:没有分类依据
流程:
# 实例化
cv = CountVectorizer()
# 调用fit_transform
data = cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
print(cv.get_feature_names())
print(data.toarray())
注意:
对于中文,默认不支持特征抽取 ,用空格隔开各个特征词(分词)就可以进行特征抽取(但也不支持单个中文字)
需要对中文进行分词才能详细的进行特征值化
为了给中文分词:jieba分词
案例:对三段话进行特征值化
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
# 1.利用jieba.cut进行分词
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系")
# 转换成列表
cn1 = list(con1)
cn2 = list(con2)
cn3 = list(con3)
# print(cn1,cn2,cn3)
# 把列表转换成字符串
c1 = ' '.join(cn1)
c2 = ' '.join(cn2)
c3 = ' '.join(cn3)
return c1,c2,c3
def hanzivec():
"""
汉字文本特征值化
:return:
"""
c1,c2,c3 = cutword()
print(c1,c2,c3)
# 2.实例化CountVectorizer
cv = CountVectorizer()
# 3.调用fit_transform
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
# co = jieba.cut("我是一个好程序员") # <generator object Tokenizer.cut at 0x0000024E85C887B0>
# print(list(co))
hanzivec()
(3)文本特征抽取:方式②
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
类:sklearn.feature_extraction.text.TfidfVectorizer
TfidfVectorizer语法:
TfidfVectorizer(stop_words=None,…)
# 返回词的权重矩阵
TfidfVectorizer.fit_transform(X,y)
# X:文本或者包含文本字符串的可迭代对象
# 返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X)
# X:array数组或者sparse矩阵
# 返回值:转换之前数据格式
TfidfVectorizer.get_feature_names()
# 返回值:单词列表
举例:
def tfidfvec():
"""
对文本特征抽取
:return:
"""
c1, c2, c3 = cutword()
# 实例化
cv = TfidfVectorizer()
# 调用fit_transform
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
if __name__ == '__main__':
# co = jieba.cut("我是一个好程序员") # <generator object Tokenizer.cut at 0x0000024E85C887B0>
# print(list(co))
tfidfvec()
2、数据的特征预处理
特征处理:
(1)归一化处理
多个特征同等重要时,需要进行归一化
目的:使得某一个特征对最终结果不会造成太大影响
缺点:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
类:sklearn.preprocessing.MinMaxScaler
MinMaxScalar语法:
MinMaxScalar(feature_range=(0,1)…)
# 每个特征缩放到给定范围(默认[0,1])
MinMaxScalar.fit_transform(X)
# X:numpy array格式的数据[n_samples,n_features]
# 返回值:转换后的形状相同的array
举例:
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
:return:
"""
# 实例化
mm = MinMaxScaler(feature_range=(2,3))
# 调用方法
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
if __name__ == '__main__':
mm()
(2)标准化处理(常用)
对比归一化,标准化的优点:
对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
类:scikit-learn.preprocessing.StandardScaler
StandardScaler语法:
StandardScaler(…)
# 处理之后每列来说所有数据都聚集在均值0附近方差为1
StandardScaler.fit_transform(X,y)
# X:numpy array格式的数据[n_samples,n_features]
# 返回值:转换后的形状相同的array
StandardScaler.mean_
# 原始数据中每列特征的平均值
StandardScaler.std_
# 原始数据每列特征的方差
举例:
- 实例化StandardScaler
- 调用方法fit_transform
from sklearn.preprocessing import StandardScaler
def ss():
"""
归一化处理
:return:
"""
# 实例化StandardScaler
ss = StandardScaler()
# 调用方法fit_transform
data = ss.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
if __name__ == '__main__':
ss()
(3)缺失值处理(pandas中为主)
缺失值的处理方法:
类:sklearn.preprocessing.Imputer
,0.22版本以后为sklearn.impute.SimpleImputer
注意:0.22版本以后的sklearn.imputer
不在preprocessing
里了,而是在sklearn.impute
里,除了SimpleImputer外,还增加了KNNImputer,另外还有IterativeImputer用法。
将导入的方式改成from sklearn.impute import SimpleImputer
就好啦
语法:
Imputer(missing_values='NaN', strategy='mean', axis=0)
# 完成缺失值插补
# 0.22版本以后:
SimpleImputer(missing_values='NaN',strategy='mean')
# 按mean值填补缺失值,没有axis=0这一项
Imputer.fit_transform(X,y)
# X:numpy array格式的数据[n_samples,n_features]
# 返回值:转换后的形状相同的array
举例:
- 初始化Imputer,指定”缺失值”,指定填补策略,指定行或列
注:缺失值也可以是别的指定要替换的值 - 调用fit_transform
import numpy as np
from sklearn.impute import SimpleImputer
def im():
"""
缺失值处理
:return:
"""
# 实例化
im = SimpleImputer(strategy='mean')
# 调用方法
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
if __name__ == '__main__':
im()
3.数据降维
(1)特征选择
主要方法(三大武器):
- Filter(过滤式):VarianceThreshold
- Embedded(嵌入式):正则化、决策树
- Wrapper(包裹式)
- 其他:神经网络
Filter(过滤式):
类:sklearn.feature_selection.VarianceThreshold
语法:
VarianceThreshold(threshold = 0.0)
# 删除所有低方差特征
Variance.fit_transform(X,y)
# X:numpy array格式的数据[n_samples,n_features]
# 返回值:训练集差异低于threshold的特征将被删除。
# 默认值是保留所有非零方差特征,即删除所有样本
# 中具有相同值的特征。
举例:
- 初始化VarianceThreshold,指定阀值方差
- 调用fit_transform
from sklearn.feature_selection import VarianceThreshold
def vt():
"""
特征选择:删除低方差的特征
:return:
"""
# 实例化
vt = VarianceThreshold(threshold=0.0)
# 调用方法
data = vt.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
if __name__ == '__main__':
vt()
(2)主成分分析
类:sklearn. decomposition
语法:
PCA(n_components=None)
# 将数据分解为较低维数空间
# n_components为小数时表示保留维数的百分比,最好在90%-95%,为整数时表示减少到的特征数量
PCA.fit_transform(X)
# X:numpy array格式的数据[n_samples,n_features]
# 返回值:转换后指定维度的array
PCA:(适用于维数特征达到上百的数据)
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
作用:可以削减回归分析或者聚类分析中特征的数量
举例:
- 初始化PCA,指定减少后的维度
- 调用fit_transform
from sklearn.decomposition import PCA
def pa():
"""
主成分分析进行特征降维
:return:
"""
# 实例化
pa = PCA(n_components=0.95)
# 调用方法
data = pa.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
if __name__ == '__main__':
pa()