前言
临时学习,浅学皮毛
机器学习是什么
数据 模型 预测 从历史数据当中获得规律
机器学习算法分类
监督学习
目标值: 类别 -分类问题
k-近邻算法, 贝叶斯分类, 决策树与随机森林 , 逻辑回归
目标值: 连续型的数据 - 回归问题
线性回归,岭回归
目标值: 无 - 无监督学习
聚类 k-means
分类问题指的是分类别,辨别是什么
回归问题指的一系列数据预测
机器学习开发流程
- 开发流程都是一样
- 数据获取
- 数据处理
- 特征工程
- 机器学习算法训练-也叫模型
- 模型评估
- 应用
python-sklearn
pip install Scikit-learn==0.19.1 //安装
pip install sklearn
命令行pip list 查看是否有sklearn
scikit-learn数据集api
sklearn.datasets.load_*() 获取小规模数据集
sklearn.datasets.fetch_*() 获取大规模数据集
小数据集
sklearn.datasets.load_iris() //加载返回鸢尾花卉数据集
测试获取数据集
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)
print("目标值的名字:\n",iris.target_names)
print("特征值:\n",iris["data"])
return
if __name__ == '__main__':
datasets_demo()
数据集的划分
机器学习一般数据集会划分两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比率: 测试集: 20%-30%
数据集划分api
from sklearn.model_selection import train_test_split #数据集划分
# 数据集划分
# 参数:1.x特征值2.y数据集标签值3.测试集大小指定浮点型,有默认0.25,4.随机种子random_state
# 固定接收顺序 训练特征值 测试特征值 训练目标值 测试目标值
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
特征工程
特征工程的作用决定了机器学习的上线,而算法和模型只是逼近这个上限而已
什么是特征工程
用于转换数据类型为数值类型用于机器学习
sklearn 特征工程
pandas 用来数据清洗,数据处理
特征抽取/特征提取
机器学习算法-统计方法-数学公式
文本类型数据 -> 数值数据
特征提取
将任意数据转换可以用于机器学习的数字特征
1.特征提取
sklearn.feature_extraction
2.字典特征提取
sklearn.feature_extraction.DicVectorizer(sparse=True) //默认返回sparse矩阵
DicVectorizer.fit_transform(data) 返回sparse矩阵,标识的是有值的坐标
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
对字典类型的数据进行特征抽取
return None
:return:
"""
data = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}]
# 实例化转换器类
transfer = DictVectorizer(sparse=False)
# fit_transform 调用传入数据,
# data_new = transfer.fit_transform(data)
data_new = transfer.fit_transform(data)
print("属性:\n",data_new)
print("特征名称:\n",transfer.get_feature_names())
return None
3.文本特征提取
单词 作为 特征 句子 等
特征: 特征词
方法1:CountVectorizer 统计每个样本特征词出现的个数
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"]
transfer = CountVectorizer() # 没有sparse=False这个参数,可以直接转换
data_new = transfer.fit_transform(data)
print(data_new.toarray())
print("特征名称:n",transfer.get_feature_names())
return None
from sklearn.feature_extraction.text import CountVectorizer
def count_chinese_demo():
"""
中文文本特征抽取 CountVectorizer
:return:
"""
data = ["我爱 背景 天安门","天安门 上 太阳升"]
transfer = CountVectorizer() # 没有sparse=False这个参数,可以直接转换
data_new = transfer.fit_transform(data)
# 英文有空格隔开,中文没有空格默认会一段话作为特征词
# 想要按词就得空格隔开
print(data_new.toarray())
print("特征名称:n",transfer.get_feature_names())
return None
from sklearn.feature_extraction.text import CountVectorizer
import jieba #没有安装就pip install jieba
def word_cut(word):
"""
定义jieba 特征分词
:return:
"""
return " ".join(list(jieba.cut(word)))
def count_chinese_demo2():
"""
中文分词
:return:
"""
data = ["红尘一醉,愿得一人心","烟火夫妻,白首不相离。","弱水三千,我只取一瓢饮。","红颜易逝,伊不离君不弃。","用我三生烟火,换你一世迷离!"]
data_new = []
for i in data:
data_new.append(word_cut(i))
transfer = CountVectorizer()
data_new = transfer.fit_transform(data_new)
print(data_new)
print("特征值名称:\n",transfer.get_feature_names())
return None
有一些没用的词组比如你好出现的次数很多,会对结果造成很大影响
方法2:TfidfVectorizer
TF-TDF - 重要程度, TF - 词频,IDF - 逆向文档频率
返回的值越大重要程度就越大
from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_demo():
"""
用TF-IDF的方法进行文本特征抽取
:return:
"""
data = ["红尘一醉,愿得一人心","烟火夫妻,白首不相离。","弱水三千,我只取一瓢饮。","红颜易逝,伊不离君不弃。","用我三生烟火,换你一世迷离!"]
data_new = []
for i in data:
data_new.append(word_cut(i))
transfer = TfidfVectorizer()
data_new = transfer.fit_transform(data_new)
print(data_new.toarray())
print("特征值名称:\n",transfer.get_feature_names())
return None
特征预处理
通过转换函数将特征数据转换成更加适合算法模型的特征数据过程
进行归一化/标准化
归一化:稳定性较差,只适合传统精确小数据场景,最大值和最小值容易受到异常点影响
from sklearn.preprocessing import MinMaxScaler # 归一化
import pandas as pd
def minmax_demo():
"""
归一化
:return:
"""
# 获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3]
# 实例一个转换器
transfer = MinMaxScaler(feature_range=[2,3])# 默认是0-1区间
data_new = transfer.fit_transform(data)
标准化:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值影响并不大
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
标准化
:return:
"""
# 获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3]
# 实例一个转换器
transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print(data_new)
return None
特征降维
限定条件下,降低随机变量(特征)个数,得到一组不相关主变量的过程
特征选择
Filter郭律师
方差选择法:低方差特征过滤,过滤掉一些不重要的特征
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 获取数据
data = pd.read.csv("factor_returns.csv")
data = data.iloc[:,1:-2]
# 创建实例
transfer = VarianceThreshold(threshold=5) #设置预值
transfer.fit_transform(data)
相关系数 - 特征与特征之间的相关系数
如何知道那两个相关系数很强呢?
from scipy.stats import pearsonr
# 计算两个变量之间的相关系数
pearsonr(data["pe_ratio"],data["pb_ratio"])
特征与特征之间相关性很高:
1.选取其中 一个
2.加权求和
3.主成分分析解决
Embeded嵌入式
决策树
正则化
深度学习
主成分分析
sklearn.decomposition.PCA(n_components=None)
n_components
小数 表示保留百分之之多少的信息
整数 减少到多少特征
from sklearn.decomposition import PCA # 主成分分析
def pca_demo():
"""
PCA将为
:return:
"""
data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
# 实例化一个转换器类
transfer = PCA(n_components=0.95)# 尽可能保留百分之95
# 调用fit_transform
data_new = transfer.fit_transform(data)
print(data_new)
return None
转换器
之前做特征工程的步骤
实例化(实例化的是一个转换器类)
调用fit_transform(对于文档建立分词频矩阵)
我们把特征工程的接口称之为转换器,其中转换器调用有那么几种形式
fit_transform
fit 计算 每一列的平均值,标准差
transform (x-mean)/std进行最终的转换
预估器
在sklearn中,预估器机器学习算法的实现
1.用于分类的预估起:
- sklearn.neighbors k-近邻算法
- sklearn.naive_bayes 贝叶斯
- sklearn.linear_model.LogisticRegression 逻辑回归
- sklearn.tree 决策树与随机森林
2.用于回归的预估器
- sklearn.linear_model.LinearRegression 线性回归
- sklearn.linear_model.Rideg 岭回归
3.用于无监督学习的预估器
- sklearn.cluster.KMeans 聚类
预估器算法实现:
预估器(estimator)
1.实例化一个estimator
2.estimator.fit(x_train,y_train) 传入训练特征值和训练目标值计算
调用完生成模型
3.模型评估
直接对比真实值和预测值
y_predict = estimator.predict(x_test) 传入测试值,生成预测结果
y_test == y_predict 测试目标值和预测值比较
计算准确率
accuracy = estimator.score(x_test,y_test)
线性回归
线性回归是利用回归方程(函数)对于一个或者多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式
y = w1x1 + w2x2 + w3x3 + ..... + wnxn + b = wTx +b
线性模型定义
自变量一次
y = w1x1 + w2x2 + w3x3 + ..... + wnxn + b = wTx +b
参数一次
y = w1x1 + w2x1^2 + w3x1^3 + w4x1^3 + ..... + b
线性关系和线性模型
线性关系一定是线性模型
线性模型不一定是线性关系
线性回归损失和优化
目的是为了让参数能够更加准确
真实的结果和预测的结果存在一定的误差,通过损失函数减少这个损失,且可以通过一些优化方法优化
优化损失
优化方法有两个:
正规方程
梯度下降
回归性能评估
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.linear_model import LinearRegression,SGDRegressor #预估器
from sklearn.metrics import mean_squared_error #性能评估
def linear1():
"""
正规方程的优化方法对波士顿房价进行预测
:return:
"""
# 1.获取数据
boston = load_boston()
# 2.划分数据集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
# 3.标准化
transfer = StandardScaler()
x_train=transfer.fit_transform(x_train) #训练特征值
x_test=transfer.transform(x_test)# 测试特征值
# 4.预估器
estimator = LinearRegression()
estimator.fit(x_train,y_train)
# 5.得出模型
print("正规方程权重系数为:\n",estimator.coef_)
print("正规方程偏置为:\n",estimator.intercept_)
# 6.模型评估
y_predict = estimator.predict(x_test)
print("正规方程预测房价\n",y_predict)
error = mean_squared_error(y_test,y_predict)
print("正规方程-均方误差\n",error)
def linear2():
"""
梯度下降的优化方法对波士顿房价进行预测
:return:
"""
# 1.获取数据
boston = load_boston()
# 2.划分数据集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
# 3.标准化
transfer = StandardScaler()
x_train=transfer.fit_transform(x_train) #训练特征值
x_test=transfer.transform(x_test)# 测试特征值
# 4.预估器
estimator = SGDRegressor()
estimator.fit(x_train,y_train)
# 5.得出模型
print("梯度下降权重系数为:\n",estimator.coef_)
print("梯度下降偏置为:\n",estimator.intercept_)
# 6.模型评估
y_predict = estimator.predict(x_test)
print("梯度下降预测房价\n",y_predict)
error = mean_squared_error(y_test,y_predict)
print("梯度下降-均方误差\n",error)
pandas数据实际预测练习
部分数据
#模型构建
tedata = salesData.loc[salesData['地区']=="Western",['年度','季度','月份','天']]
# tedata['国家']=pd.factorize(salesData.loc[salesData['地区']=="Western"]['国家'])[0] # 转换成特征值,由于学习和预测需要匹配,
# tedata['城市']=pd.factorize(salesData.loc[salesData['地区']=="Western"]['城市'])[0] # 预测的数据没想好如何模拟,这三种数据,
# tedata['地区']=pd.factorize(salesData.loc[salesData['地区']=="Western"]['地区'])[0] # 此方法可以便捷转换成独立的特征值
tedata['利润']=salesData.loc[salesData['地区']=="Western",['利润']]
# tedata.head()
#方差标准化函数
def StandarScaler(data):
new_data = (data - data.mean())/ (data.std()+0.0001)
return new_data
tedata.head()
netedata = StandarScaler(tedata.iloc[:,:-1])
netedata['利润']=tedata['利润']
netedata.head()
from sklearn.model_selection import train_test_split
# 划分数据集
# test_size = 20
# train_size_pro = len(netedata.iloc[:,:-1]) - test_size
# x_train,y_train = pd.DataFrameFrame(netedata.iloc[:train_size_pro,:-1]),pd.DataFrameFrame(netedata.iloc[:train_size_pro,:-1]) #训练集
x_train,x_test,y_train,y_test=train_test_split(netedata.iloc[:,:-1],netedata.iloc[:,:-1],random_state=22) #这边直接使用sklearn划分
from sklearn.linear_model import LinearRegression
estimator = LinearRegression()
estimator.fit(x_train,y_train)
print("正规方程权重系数为:\n",estimator.coef_)
print("正规方程偏置为:\n",estimator.intercept_)
y_predict = estimator.predict(x_test)
# 模型评估
from sklearn.metrics import mean_squared_error
error = mean_squared_error(y_test,y_predict)
np.sqrt(error)
data1 = pd.date_range(start='2022/1/1',end='2022/12/31',freq='D')
dic = {"日期":data1}
data = pd.DataFrame(dic)
data['年度']=data['日期'].dt.year
data['季度']=data['日期'].dt.quarter
data['月份']=data['日期'].dt.month
data['天']=data['日期'].dt.day
data_new = StandarScaler(data.iloc[:,1:])#标准化
# data_west=pd.concat([x_test,data_new])#合并,不合并也可以
data_pre = estimator.predict(data_new).flatten()[:365]# 预测
dit = {"日期":data1,"利润":data_pre}#展开数组
pd.DataFrame(dit)['利润']
随机森林
什么是随机森林?
随机森林是集成了决策树的分类器,多个分类器预测,最后结合成组合预测
随机森林原理过程
随机
两个随机
训练集随机
bootstrap 随机有放回抽样
特征值随机 - 从m个特征中随机抽取m个特征
降维,没用的抵消,突出的脱颖而出
#随机森林 到划分数据集开始
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()# 我们使用默认的
rf.fit(x_train,y_train)#模型
rf_test = rf.predict(x_test)#测试
# 均方误差评估
from sklearn.metrics import mean_squared_error
error = mean_squared_error(y_test,rf_test)#对比
np.sqrt(error)# 误差
# 其余同上
k-means学习
什么是无监督学习
没有目标值 - 无监督学习
聚类步骤
随机设置k个特征空间内的点作为初始聚类中心
对于其他每个点计算到k个中心的距离,离最近的聚类点作为标记类别
对标记的聚类中心之后,重新计算每个聚类新中心点(平均点)
直到新中心点和原中心点相同,那么结束,不相同则进行下一步操作
# 聚类 dataframe
from sklearn.cluster import KMeans
#分4类
model = KMeans(n_clusters=4).fit(data)
# 建模
# 先对需要构建模型的进行特征化
pd.factorize() # 特征值转化
# 进行标准化处理,对预测或者分类的值不能进行标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit_transform(feature)
# 划分数据集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(wine_data,wine_label,test_size=0.2,random_state=22) #这边直接使用sklearn划分
# k-mean聚类分析
from sklearn.cluster import KMeans
model = KMeans(n_clusters=5).fit(scaler) # 模型构建
# 聚类评分(分数越高越好)
from sklearn.metrics import fowlkes_mallows_score
fowlkes_mallows_score(wine_train_label,kmeans.labels_)
全代码
from sklearn.datasets import load_iris #鸢尾花数据集
from sklearn.model_selection import train_test_split #数据集划分
from sklearn.feature_extraction import DictVectorizer # 英文特征分词
from sklearn.feature_extraction.text import CountVectorizer # 中文特征分词
import jieba #没有安装就pip install jieba #中文词组分组库
from sklearn.feature_extraction.text import TfidfVectorizer # TD-IDF文本特征抽取
from sklearn.preprocessing import MinMaxScaler # 归一化
import pandas as pd # pandas数据分析库
from sklearn.preprocessing import StandardScaler # 标准化
from sklearn.feature_selection import VarianceThreshold #过滤低方差特征
from scipy.stats import pearsonr #相关系数
from sklearn.decomposition import PCA # 主成分分析
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)
print("目标值的名字:\n",iris.target_names)
print("特征值:\n",iris["data"])
# 数据集划分
# 参数:1.x特征值2.y数据集标签值3.测试集大小指定浮点型,有默认0.25,4.随机种子random_state
# 固定接收顺序 训练特征值 测试特征值 训练目标值 测试目标值
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
return None
def dict_demo():
"""
对字典类型的数据进行特征抽取
return None
:return:
"""
data = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}]
# 实例化转换器类
transfer = DictVectorizer(sparse=False)
# fit_transform 调用传入数据,
# data_new = transfer.fit_transform(data)
data_new = transfer.fit_transform(data)
print("属性:\n",data_new)
print("特征名称:\n",transfer.get_feature_names())
return None
def count_demo():
"""
英文文本特征抽取 CountVectorizer
:return:
"""
data = ["life is short,i like like python","life is too long, i dislike python"]
transfer = CountVectorizer() # 没有sparse=False这个参数,可以直接转换
data_new = transfer.fit_transform(data)
print(data_new.toarray())
print("特征名称:n",transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取 CountVectorizer
:return:
"""
data = ["我爱 背景 天安门","天安门 上 太阳升"]
transfer = CountVectorizer() # 没有sparse=False这个参数,可以直接转换
data_new = transfer.fit_transform(data)
# 英文有空格隔开,中文没有空格默认会一段话作为特征词
# 想要按词就得空格隔开
print(data_new.toarray())
print("特征名称:n",transfer.get_feature_names())
return None
def word_cut(word):
"""
定义jieba 特征分词
:return:
"""
return " ".join(list(jieba.cut(word)))
def count_chinese_demo2():
"""
中文分词
:return:
"""
data = ["红尘一醉,愿得一人心","烟火夫妻,白首不相离。","弱水三千,我只取一瓢饮。","红颜易逝,伊不离君不弃。","用我三生烟火,换你一世迷离!"]
data_new = []
for i in data:
data_new.append(word_cut(i))
transfer = CountVectorizer()
data_new = transfer.fit_transform(data_new)
print(data_new)
print("特征值名称:\n",transfer.get_feature_names())
return None
def tfidf_demo():
"""
用TF-IDF的方法进行文本特征抽取
:return:
"""
data = ["红尘一醉,愿得一人心","烟火夫妻,白首不相离。","弱水三千,我只取一瓢饮。","红颜易逝,伊不离君不弃。","用我三生烟火,换你一世迷离!"]
data_new = []
for i in data:
data_new.append(word_cut(i))
transfer = TfidfVectorizer()
data_new = transfer.fit_transform(data_new)
print(data_new.toarray())
print("特征值名称:\n",transfer.get_feature_names())
return None
def minmax_demo():
"""
归一化
:return:
"""
# 获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3]
# 实例一个转换器
transfer = MinMaxScaler(feature_range=[2,3])# 默认是0-1区间
data_new = transfer.fit_transform(data)
return None
def stand_demo():
"""
标准化
:return:
"""
# 获取数据
data = pd.read_csv("dating.txt")
data = data.iloc[:,:3]
# 实例一个转换器
transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print(data_new)
return None
def variance_demo():
"""
过滤低方差特征
:return:
"""
# 获取数据
data = pd.read.csv("factor_returns.csv")
data = data.iloc[:,1:-2]
# 创建实例
transfer = VarianceThreshold(threshold=5) #设置预值
data_new = transfer.fit_transform(data)
print(data_new)
# 计算两个变量之间的相关系数
pearsonr(data["pe_ratio"],data["pb_ratio"])
return None
def pca_demo():
"""
PCA将为
:return:
"""
data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
# 实例化一个转换器类
transfer = PCA(n_components=0.95)# 尽可能保留百分之95
# 调用fit_transform
data_new = transfer.fit_transform(data)
print(data_new)
return None
if __name__ == '__main__':
#代码1:sklearn数据集使用
# datasets_demo()
#代码2:字典特征抽取
# dict_demo()
#代码3: 文本特征抽取
# count_demo()
# count_chinese_demo()
# 代码4.jieba 特征值分词抽取
# count_chinese_demo2()
# 代码5.TF-IDF 特征值抽取
# tfidf_demo()
# 代码6.归一化
# minmax_demo()
pca_demo()