赞
踩
临时学习,浅学皮毛
数据 模型 预测 从历史数据当中获得规律
目标值: 类别 -分类问题
k-近邻算法, 贝叶斯分类, 决策树与随机森林 , 逻辑回归
目标值: 连续型的数据 - 回归问题
线性回归,岭回归
目标值: 无 - 无监督学习
聚类 k-means
分类问题指的是分类别,辨别是什么
回归问题指的一系列数据预测
pip install Scikit-learn==0.19.1 //安装
pip install sklearn
命令行pip list 查看是否有sklearn
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%
- 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.用于分类的预估起:
2.用于回归的预估器
3.用于无监督学习的预估器
预估器算法实现:
预估器(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)
部分数据
- #模型构建
- 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个特征空间内的点作为初始聚类中心
对于其他每个点计算到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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。