python机器学习

前言

        临时学习,浅学皮毛

机器学习是什么

数据        模型        预测        从历史数据当中获得规律

机器学习算法分类

监督学习

目标值: 类别 -分类问题

        k-近邻算法, 贝叶斯分类, 决策树与随机森林 , 逻辑回归

目标值: 连续型的数据 - 回归问题

        线性回归,岭回归

目标值: 无 - 无监督学习

        聚类 k-means

分类问题指的是分类别,辨别是什么

回归问题指的一系列数据预测

机器学习开发流程

  1. 开发流程都是一样
  2. 数据获取
  3. 数据处理
  4. 特征工程
  5. 机器学习算法训练-也叫模型
  6. 模型评估
  7. 应用

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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值