机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测
第一种:
识别猫和狗:
特征值:图片
目标值:猫/狗**-类别**
分类问题
第二种:
房屋价格预测:
特征值:房屋的各个属性信息
目标值:房屋价格**-连续型的数据**
回归问题
说一下他们具体问题分类:
1、预测明天的天气是多少度? 回归
2、依存明天是阴天还是晴天还是雨天?分类
3、人脸年龄预测?分类或回归
4、人脸识别?分类
监督学习:预测
无监督学习
流程:
1)获取数据
2)数据处理
3)特征工程
4)机器学习算法训练-得到模型
5)模型评估
6)应用
大部分复杂模型的算法设计都是算法工程师在做,而我们
目标
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址: http://scikit-learn.org/stable/datasets/index.html#datasets
https://scikit-learn.org.cn/
scikit-learn特点:
UCI特点:
Kaggle特点:
2 安装
pip install Scikit-learn -i https://pypi.douban.com/simple
安装好之后可以通过以下命令查看是否安装成功
import sklearn
注:安装scikit-learn需要Numpy,Scipy等库
1 scikit-learn数据集API介绍
2 sklearn小数据集
3 sklearn大数据集
sklearn.datasets.fetch_20newsgroups(data=None, subset=‘train’)
4 sklearn数据集的使用
sklearn数据集返回值介绍
load和fetch返回的数据类型datasets.base.Bunch(字典格式)
from sklearn.datasets import load_iris
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) # shape:(150,4)
return None
if __name__ == "__main__":
datasets_demo()
查看特征值的名字:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
机器学习一般的数据集会划分为两个部分:
划分比例:
数据集划分api:sklearn.model_selection.train_test_split(arrays, *options)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
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) # 150个样本
# 数据集划分 X为特征 Y为标签
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) # 120个样本
return None
if __name__ == "__main__":
datasets_demo()
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
意义:会直接影响机器学习的效果
特征工程包含内容:
1 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值是为了计算机更好的去理解数据
2 特征提取API
sklearn.feature_extraction
作用:对字典数据进行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True, …)
1 应用
对数据进行特征提取:将类别转换为one-hot编码,节省内存,提高下载效率
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{
'city':'北京', 'temperature':100},
{
'city':'上海', 'temperature':60},
{
'city':'深圳', 'temperature':30}]
# 1、实例化一个转换器类
#transfer = DictVectorizer() # 返回sparse矩阵
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new) # 转化后的
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
dict_demo()
data_new:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
单词作为特征
作用:对文本数据进行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):返回词频矩阵
sklearn.feature_extraction.text.TfidVectorizer
1 应用
英文文本分词
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
"""
文本特征抽取:CountVectorizer
:return:
"""
data = ['life is short,i like like python',
'life is too long,i dislike python']
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray()) # toarray转换为二维数组
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
count_demo()
data_new:
[[0 1 1 2 0 1 1 0]
[1 1 1 0 1 1 0 1]]
特征名字:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
停用词:stop_words=[]
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
"""
文本特征抽取:CountVectorizer
:return:
"""
data = ['life is short,i like like python',
'life is too long,i dislike python']
# 1、实例化一个转换器类
transfer = CountVectorizer(stop_words=['is', 'too'])
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray()) # toarray转换为二维数组
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
count_demo()
data_new:
[[0 1 2 0 1 1]
[1 1 0 1 1 0]]
特征名字:
['dislike', 'life', 'like', 'long', 'python', 'short']
中文文本分词
注意:不支持单个中文词!
这个方法是计算特征词出现的个数的
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
"""
文本特征抽取:CountVectorizer
:return:
"""
data = ['我 爱 北京 天安门',
'天安门 上 太阳 升']
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray()) # toarray转换为二维数组
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
count_demo()
data_new:
[[1 1 0]
[0 1 1]]
特征名字:
['北京', '天安门', '太阳']
例2
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def count_chinese_demo2():
"""
中文文本特征抽取,自动分词
:return:
"""
data = ['一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。',
'如果只用一种方式了解某件事物,他就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def cut_word(text):
"""
进行中文分词:“我爱北京天安门” -> "我 爱 北京 天安门"
:param text:
:return:
"""
return ' '.join(jieba.cut(text))
if __name__ == "__main__":
count_chinese_demo2()
#print(cut_word('我爱北京天安门'))
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
data_final:
[[2 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1
0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0
1]
[1 1 0 0 4 2 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0
0]]
特征名字:
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
5 Tf-idf文本特征提取
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def cut_word(text):
"""
进行中文分词:“我爱北京天安门” -> "我 爱 北京 天安门"
:param text:
:return:
"""
return ' '.join(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()
# 2、调用fit_transform
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
tfidf_demo()
#print(cut_word('我爱北京天安门'))
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某件事 物 , 他 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
data_final:
[[0.30847454 0. 0.20280347 0. 0. 0.
0.40560694 0. 0. 0. 0. 0.
0.20280347 0. 0.20280347 0. 0. 0.
0. 0.20280347 0.20280347 0. 0.40560694 0.
0.20280347 0. 0.40560694 0.20280347 0. 0.
0. 0.20280347 0.20280347 0. 0. 0.20280347
0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0.55004769 0. 0. 0. 0. 0.2410822
0. 0. 0. 0. 0.48216441 0.
0. 0. 0. 0. 0.2410822 0.
0.2410822 ]
[0.12826533 0.16865349 0. 0. 0.67461397 0.33730698
0. 0. 0. 0. 0.16865349 0.16865349
0. 0.16865349 0. 0.16865349 0.16865349 0.
0.12826533 0. 0. 0.16865349 0. 0.
0. 0.16865349 0. 0. 0. 0.33730698
0.16865349 0. 0. 0.16865349 0. 0.
0. ]]
特征名字:
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某件事', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程
数值数据的无量纲化:
2 特征预处理API
sklearn.preprocessing
为什么要进行归一化/标准化?
1 定义
通过对原始的数据进行变换把数据映射到(默认为[0,1]之间)
2 公式
3 API
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
MinMaxScaler.fit_transform(X),X:numpy array格式的数据[n_samples,n_features],返回值:转换后的形式相同的array
4 数据计算
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归一化
:return:
"""
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = MinMaxScaler()
#transform = MinMaxScaler(feature_range=[2,3])
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
minmax_demo()
问题:如果有异常值会有什么影响
异常值:最大值,最小值
5 归一化总结
注意最大值最小值是变化的,另外,最大值与最小值非常容易受到异常值影响,
所以这种方法鲁棒性较差,只适合传统精确小数据场景
1 定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内
4 代码
sklearn.perprocessing.StandradScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X),X;numpy array格式的数据[n_samples,n_features],返回值:转化后的形状相同的array
from sklearn.preprocessing import MinMaxScaler, StandardScaler
def stand_demo():
"""
标准化
:return:
"""
# 1、获取数据
data = pd.read_csv("datingTestSet2.txt", sep='\t')
data = data.iloc[:, :3]
print("data:\n", data)
# 2、实例化一个转换器类
transform = StandardScaler()
#transform = StandardScaler(feature_range=[2,3])
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
stand_demo()
5 标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
1 定义
数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征
2 方法
Filter过滤式:主要探究特征本身特点、特征与特征和目标值之间关联
Embedded嵌入式:算法自动选择特征(特征与目标值之间的关联)
3 模块
sklearn.feature_selection
4 过滤式
4.1 低方差特征过滤
删除低方差的一些特征
4.1.1 API
sklearn.feature_selection.VArianceThreshold(threshold=0.0)
删除所有低方差特征
Variance.fit_transform(X),X:numpy array格式的数据[m_sample,n_features],返回值:训练集差异低于threadshold的特征将被删除。默认值是保留非零方差特征,即删除所有样本中具有相同值的特征
4.1.2 数据计算
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
低方差特征过滤
:return:
"""
# 1、获取数据
data = pd.read_csv('factor_returns.csv')
print('data:\n', data)
data = data.iloc[:,1:-2]
print('data:\n', data)
# 2、实例化一个转换器类
#transform = VarianceThreshold()
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new, data_new.shape)
return None
if __name__ == "__main__":
variance_demo()
4.2 相关系数
皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标
4.2.3 特点
相关系数的值介于-1与+1之间,即-1<=r<=+1。其性质如下:
4.2.4 API
from scipy.stats import pearsonr
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
def variance_demo():
"""
低方差特征过滤
:return:
"""
# 1、获取数据
data = pd.read_csv('factor_returns.csv')
print('data:\n', data)
data = data.iloc[:,1:-2]
print('data:\n', data)
# 2、实例化一个转换器类
#transform = VarianceThreshold()
transform = VarianceThreshold(threshold=10)
# 3、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new, data_new.shape)
# 计算两个变量之间的相关系数
r = pearsonr(data["pe_ratio"],data["pb_ratio"])
print("相关系数:\n", r)
return None
if __name__ == "__main__":
variance_demo()
相关系数看前面那个
如果特征与特征相关性很高:
1)选取其中一个
2)加权求和
3)主成分分析
定义:高维数据转换为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息
应用:回归分析或者聚类分析中
1 计算案例理解
二维降到一维
2 代码
sklearn.decomposition.PCA(n_components=None)
3 数据计算
from sklearn.decomposition import PCA
def pca_demo():
"""
PCA降维
:return:
"""
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化一个转换器类
transform = PCA(n_components=2) # 4个特征降到2个特征
# 2、调用fit_transform
data_new = transform.fit_transform(data)
print("data_new\n", data_new)
transform2 = PCA(n_components=0.95) # 保留95%的信息
data_new2 = transform2.fit_transform(data)
print("data_new2\n", data_new2)
return None
if __name__ == "__main__":
pca_demo()
data_new
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
data_new2
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
数据:
1)order_prodects_prior.csv:订单与商品信息
处理成这个样子
需求
1)需要将user_id和aisle放在同一个表中—合并
2)找到user_id和aisle----交叉表和透视表
# 1、获取数据
# 2、合并表
# 3、找到suer_id和aisle之间的关系
# 4、PAC降维
import pandas as pd
# 1、获取数据
order_products = pd.read_csv('./instacart/order_products__prior.csv') #32434489× 4
products = pd.read_csv('./instacart/products.csv') # (49688,4)
orders = pd.read_csv('./instacart/orders.csv') #3421083 rows × 7 columns
aisles = pd.read_csv('./instacart/aisles.csv') #(134,2)
# 2、合并表'
# 合并aisles和products
tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"]) #49688 × 5 c
tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"])#32434489 ,8
tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"])#32434489 ,14
# tab3.head()
# 3、找到suer_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"], tab3["aisle"]) #206209 rows × 134 columns
data = table[:10000] #10000 rows × 134 columns
# 4、PAC降维
from sklearn.decomposition import PCA
# 1)实例化一个转换器类
transfer = PCA(n_components=0.95) # 保留95%的信息
# 2)调用fit_transform
data_new = transfer.fit_transform(data) #(10000, 42),由134个特征降维到42个