GVKun编程网logo

Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表(python速查表)

3

如果您对Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Numpy、Pandas、M

如果您对Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表的详细内容,我们还将为您解答python速查表的相关问题,并且为您提供关于keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度、numpy+pandas+matplotlib+tushare股票分析、Numpy,Pandas,Matplotlib、numpy.random.random & numpy.ndarray.astype & numpy.arange的有价值信息。

本文目录一览:

Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表(python速查表)

Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表(python速查表)

Numpy

Pandas

Matplotlib

Keras

Scikit-Learn



本篇文章由一文多发平台ArtiPub自动发布

keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度

keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度

如何解决keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度

我有一个神经网络,其中一个隐藏层在 Keras 和 scikit-learn 中实现,用于解决回归问题。在 scikit-learn 中,我使用了 MLPregressor 类,主要是默认参数,在 Keras 中,我有一个隐藏的 Dense 层,其参数设置为与 scikit-learn 相同的默认值(它使用具有相同学习率和 epsilon 的 Adam,batch_size 为 200)。当我训练网络时,scikit-learn 模型的损失值大约是 keras 的一半,并且其准确性(以平均绝对误差衡量)也更好。如果不相同,损失值是否应该相似并且精度也相似?有没有人经历过类似的事情并且能够使 Keras 模型更准确?

Scikit-learn 模型:

  1. clf = MLPRegressor(hidden_layer_sizes=(1600,),max_iter=1000,verbose=True,learning_rate_init=.001)

Keras 模型:

  1. inputs = keras.Input(shape=(cols,))
  2. x = keras.layers.Dense(1600,activation=''relu'',kernel_initializer="glorot_uniform",bias_initializer="glorot_uniform",kernel_regularizer=keras.regularizers.L2(.0001))(inputs)
  3. outputs = keras.layers.Dense(1,kernel_regularizer=keras.regularizers.L2(.0001))(x)
  4. model = keras.Model(inputs=inputs,outputs=outputs)
  5. model.compile(optimizer=keras.optimizers.Adam(epsilon=1e-8,learning_rate=.001),loss="mse")
  6. model.fit(x=X,y=y,epochs=1000,batch_size=200)

解决方法

这是因为scikit-learn的均方损失(MSE)公式与tensorflow的不同。

来自scikit-learn的源码:

  1. def squared_loss(y_true,y_pred):
  2. return ((y_true - y_pred) ** 2).mean() / 2

同时来自 tensorflow 的 MSE:

  1. backend.mean(math_ops.squared_difference(y_pred,y_true),axis=-1)

如您所见,scikit-learn 一除以 2,与您所说的一致:

scikit-learn 模型的损失值大约是 keras 的一半

这意味着来自 keras 和 scikit-learn 的模型实际上实现了相似的性能。这也意味着 scikit-learn 中的学习率 0.001 并不等同于 tensorflow 中的相同学习率。

此外,另一个较小但显着的差异是 L2 正则化的公式。

来自scikit-learn的源码,

  1. # Add L2 regularization term to loss
  2. values = 0
  3. for s in self.coefs_:
  4. s = s.ravel()
  5. values += np.dot(s,s)
  6. loss += (0.5 * self.alpha) * values / n_samples

而 tensorflow 是 loss = l2 * reduce_sum(square(x))

因此,在相同的l2正则化参数下,tensorflow one的正则化更强,这将导致对训练数据的拟合较差。

numpy+pandas+matplotlib+tushare股票分析

numpy+pandas+matplotlib+tushare股票分析

一.数据导入

安装tushare模块包

pip install tushare

http://tushare.org/

tushare是一个财经数据接口包

import numpy as np
import matplotlib as plt
import pandas as pd
import tushare as ts

#获取股票号为601318的股票信息
df=ts.get_k_data("601318")

#将数据保存到本地,方便处理
df.to_csv("601318.csv",index=False)

#获取数据内的有用列,并将date列作为index
df = pd.read_csv("601318.csv",index_col="date")[["open","close","high","low","volume"]]

 

二.分析股票策略

使用双均线金叉点和死叉点

首先是添加5日均线点,和30日均线点

#获取5日均线,10日均线
df["ma5"]=np.nan
df["ma30"]=np.nan

# 方式一
# for i in range(4, len(df)):
#     df.loc[df.index[i], ''ma5''] = df[''close''][i-4:i+1].mean()

# for i in range(29, len(df)):
#     df.loc[df.index[i], ''ma30''] = df[''close''][i-29:i+1].mean()

# 方式二
df["ma5"]=df["close"].rolling(5).mean()
df["ma30"]=df["close"].rolling(30).mean()

三.查看数据图形

df[["close","ma5","ma30"]].plot()

 

 四.获取金叉和死叉点

# 获取金叉点,死叉点
golden_cross = []
death_cross = []

for i in range(1, len(df)):
    if df[''ma5''][i] >= df[''ma30''][i] and df[''ma5''][i-1] < df[''ma30''][i-1]:
        golden_cross.append(df.index[i])
    if df[''ma5''][i] < df[''ma30''][i] and df[''ma5''][i-1] >= df[''ma30''][i-1]:
        death_cross.append(df.index[i])

 

五.计算收益

first_money = 100000
money = first_money
hold = 0 # 持有的股票数

sr1 = pd.Series(1, index=golden_cross)
sr2 = pd.Series(0, index=death_cross)
sr = sr2.append(sr1).sort_index()

for i in range(0, len(sr)):
    p = df[''close''][sr.index[i]]
    if sr.iloc[i] == 1:
        #金叉
        buy = (money // p*100)
        hold += buy*100
        money -= buy*100*p
    else:
        money += hold*p
        hold = 0
        
p = df[''close''][-1]
now_money = hold*p + money

now_money - first_money

 

Numpy,Pandas,Matplotlib

Numpy,Pandas,Matplotlib

一 . numpy

-- 数据分析:就是把一些看似杂乱无章的数据信息提炼出来,总结出所研究的内在规律
-- 数据分析三剑客:Numpy,Pandas,Matplotlib
-- Numpy(Numerical Python)是python语言的一个扩展程序库,支持大量的纬度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.

  1. 创建ndarray

import numpy

# 一维数组的创建
array1 = numpy.array([1,2,3])

# 二维数组的创建(通常用的是二维)
array2 = numpy.array([[1,''two'',3],[4,5,6]])

!!! 注意:
numpy默认里面的所有元素类型都是相同的,全是数字,全是字母等
如果传进来的列表中数据类型不统一,则统一为同一类型,优先级:str>float>int

    1.1 使用matplotlib.pyplot获取一个numpy数组,数据来源一张图片

import matplotlib.pyplot as plt
img_array = plt.imread(''./sjl.jpg'')
plt.imshow(img_array)   # 显示图片

操作numpy数据同步到图片中(修图底层就是这么实现的)
img_array = img_array - 50
plt.imshow(img_array)

img_array.shape  # 得到(396, 406, 3), 前两个参数是像素,第三个是颜色,上面直接-50,是把这三个数都减了50
  

    1.2 numpy的一些用法(下面就默认已经导入了numpy啦)

numpy.full(shape=(5,6),fill_value=66)   # 返回5行6列,值为66的数组

numpy.linspace(0,100,num=10)  # 获得等差数列

numpy.arange(0,10,2)   # 从0-9,步长是2

numpy.random.randint(0,50,size=(3,3))   #0-50的随机数组成3x3的矩阵

# 固定随机性(随机因子)
numpy.random.seed(5)  # 系统指定的当前时间戳,指定之后就不变了,怎么随机都是这些数
numpy.random.randint(0,50,size=(3,3))

  2. ndarry的属性

四个必须记住的参数:
    ndim(纬度)
    shape(形状,各维度的长度)    
    size(总长度)
    dtype(元素类型)

应用: (img_array还是上面那个图片)
img_array.ndim   # 3

img_array.size   # 482328

img_array.dtype   # dtype(''uint8'')

type(img_array)   # numpy.ndarray

  3. ndarray的基本操作

    3.1 索引  (一维与列表一样,多维同理)

array2 = numpy.array([[1,''two'',3],[4,5,6]])

array2[0][1]   # two

    3.2 切片 (一维与列表一样,多维同理)

numpy.random.seed(1)
array3 = numpy.random.randint(0,100,size=(4,4))

array3[0:2]   # 获取二维数组的前两行

# 获取二数组的前两列
array3[:,0:2]   # 一个逗号用做二维数组,逗号前边是行,不要行数据的话用冒号表示

array3[0:2,0:2]   # 获取前两行中的前两列

array3[::-1]   # 将二维数组的 行 进行倒序

array3[:,::-1]   # 列倒序

array3[::-1,::-1]   # 全部都倒序

# 这里可以应用到图片旋转上(还是上面那个图片)
# img_array[row,col,color]
plt.imshow(img_array[:,::-1,:])

plt.imshow(img_array[::-1,::-1,::-1])

  3. 变形

# 将一维数组变成多维
array2 = [[''1'', ''two'', ''3''],[''4'', ''5'', ''6'']]
array2 .reshape((2,3))  # 改成2行,每行3个数据,正好6个  参数一定要是tuple

# 将多维数组变成一维
arr = [[''1'', ''two'', ''3''],
    [''4'', ''5'', ''6'']]
arr = arr .reshape((6))  # array2这个二维数组一共有6个数,也就是说,里面的tuple参数一定要是 6 

# 自动计算,用-1,前提必须其他的数都是已知数
arr.reshape((-1,2))  # 固定参数是2列,自动计算出3行

  4. 级联

numpy.concatenate()
一维,二维,多维数组的级联,实际操作中多数是二维数组

# 先建3个数组
np.random.seed(5)
a1 = numpy.random.randint(0,50,size=(4,4))
a2 = numpy.random.randint(0,50,size=(4,4))
a3 = numpy.random.randint(0,50,size=(3,4))
display(a1,a2,a3)

numpy.concatenate((a1,a2),axis=0)  # 二维数组axis只能是0或者1, 0代表列拼在一起,1代表行拼在一起

九宫格照片
img_array = plt.imread(''./sjl.jpg'')
img_3 = np.concatenate((img_array,img_array,img_array),axis=0)
img_9 = np.concatenate((img_3,img_3,img_3),axis=1)
plt.imshow(img_9)

  

  5. 切分

与级联类似,三个函数完成切分工作:
    numpy.split(array,行号/列号,轴),参数2是一个列表类型
    numpy.vsplit
    numpy.nsplit

a1 = np.random.randint(0,50,size=(4,4))
np.split(a1,[2],axis=0)  # 切的是列(就是横着切)

# 裁剪图片,用切片方法
# img_array[row,col,color]
plt.imshow(img_array[20:280,100:300,])

  6.ndarry聚合操作

a1 = np.random.randint(0,50,size=(4,4))

a1.sum(axis=0)  # axis=0,就列的和,axis=1,求行的和,不写参数,求所有数的和

最大值最小值:np.max/np.min 同理
平均值:np.mean() 同理

  7. numpy.array的排序

np.sort()nd.array.sort() 都可以,但有区别:

np.sort()不改变原数组  常用这个,因为不要轻易改变数据
ndarray.sory()本地处理,但不占用空间,但改变原数组

二 . Pandas

  先导入包,下面所有的代码就直接用了,不在导包了

import pandas as pd
import numpy as np
from pandas import Series,DataFrame

  Series

Series是一种类似于一维数组的对象,由下面两个部分组成:
    values:一组数据(ndarray类型)
    index:相关的数据索引标签

  Series的创建

三种创建方式:
    1.列表创建
    2.numpy数组创建
3.字典创建
默认索引为0到n
-1的整数索引

  Series的一些操作

# 使用列表创建Series 隐式索引(就是索引是下标0,1,2,3)
s1 = Series(data=[1,2,3,4])   # s1[0] 取到的是1

# 使用列表创建Series 显示索引,(使用显示索引,也可以使用隐式索引)
s2 = Series(data=[1,2,3,4],index=[''a'',''b'',''c'',''d''])   # s2[0]和s2[''a''] 取到的都是1
================================================
# 使用numpy创建Series
s3 = Series(data=np.random.randint(0,20,size=(5,)))

dic = {
    ''English'':100,
    ''math'':30
}
Series(data=dic)

取索引的方法还有:
    s2.loc[''a'']  #一定要拿显示索引
    s2.iloc[1]  # 一定要拿隐式索引
s2[''xxx''] = 666  # 添加

  可以通过shape,size,index,values等拿到series的属性

s2.shape   # (5,)
s2.size     # 5
s2.index  # 只能拿到显示索引   Index([''a'', ''b'', ''c'', ''d'', ''xxx''], dtype=''object'')
s2.values  # array([  1,   2,   3,   4, 666], dtype=int64)

head()与tail() 是查看前/后多少个元素
s2.head(2)   # 查看前两个

  对series去重与数据清洗

去重
s = Series(data=[1,1,1,1,2,2,2,2,3,3,3,4,4])
s.unique()  # array([1, 2, 3, 4], dtype=int64)

数据清洗
s3 = Series(data=[1,2,3,4],index=[''a'',''b'',''c'',''d''])
s4 = Series(data=[1,2,3,4],index=[''a'',''b'',''c'',''x''])

s = s3 + s4
print(s)   # 发现d和x都是NaN

a    2.0
b    4.0
c    6.0
d    NaN
x    NaN

s.isnull()
s.notnull()

a     True
b     True
c     True
d    False
x    False
dtype: bool

s[s.notnull()]

  DataFrame

DataFrame是一个 表格型 的数据结构.DataFrame由按一定顺序排列的多列数据组成,设计初衷是将Series使用场景从一维拓展到多维,DateFrame既有行索引,又有列索引.
- 行索引: index
- 列索引: columns
- 值: values

  DataFrame的创建

最常用的方法是传递一个字典来创建,DateFrame以字典的键作为每一列的名称,以字典的值(一个数组)作为每一列.

此外,DataFrame会自动加上每一行的索引.

使用字典创建DataFrame后,columns参数则不可用.

同Series一样,若传入的类与字典的键不匹配,则相应的值为NaN.
df = DataFrame(data=np.random.randint(1,10,size=(3,3)),index=[''a'',''b'',''c''],columns=[''A'',''B'',''C''])
df.values
array([[1, 6, 5],
       [1, 8, 4],
       [7, 3, 1]])

  使用字典创建DataFrame

dic = {
    ''张三'':[150,150,150,150],
    ''李四'':[0,0,0,0]
}
df = DataFrame(data=dic,index=[''语文'',''数学'',''英语'',''理综''])

       张三   李四
语文    150    0
数学    150    0
英语    150    0
理综    150    0

  DateFrame的索引

对列进行索引:

- 通过类似字典的方式  df[''key'']
- 通过属性的方式  df.key
可以将DataFrame的列获取为一个Series.返回的Series拥有相同的索引,且name属性也已经设置好了,就是相应的列名

# 修改列索引
df.columns = [''王五'',''赵六'']

# 获取列数据,用[]去只能去列并且只能是显示索引
df[''王五'']
df[[''赵六'',''王五'']]
df.loc[''语文'']


对行进行索引
- 使用loc[] 里面写显示索引
- 使用iloc[] 里面写隐性索引 

df.iloc[0]

取出确定位置的数据   df.loc[row,col]
df.loc[''理综'',''王五'']

# 王五的语文与数学成绩
df.loc[[''语文'',''数学''],''王五'']

# 可用loc或iloc中取列
df.iloc[:,0]

  切片

!!!注意->直接用中括号时:
    - 索引表示的是列索引
    - 切片表示的行索引

  实操

# 切前2行数据
df[0:2]

# 切前2列
df.iloc[:,0:2]

# 通过索引切片,可以直接写显示索引
df.loc[''语文'':''数学'']

  运算

first_exam = df
last_exam = df 

# 求first_exam与last_exam的平均成绩
(first_exam+last_exam)/2

# 王五的first_exam语文成绩取消,为0
first_exam.loc[''语文'',''王五''] = 0

# 赵六的所有first_exam成绩加100
first_exam[''赵六'']=first_exam[''赵六''] + 100

   pandas数据处理

# 删除重复元素
使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True

keep参数:指定保留哪一个重复的行数据

  创建具有重复元素行DataFrame

# 创建一个df
df = DataFrame(data=numpy.random.randint(0,100,size=(8,4)))
df.iloc[1] = [666,666,666,666]
df.iloc[3] = [666,666,666,666]
df.iloc[6] = [666,666,666,666]

  

   使用duplicated()函数检测重复的行

~df.duplicated(keep=''first'')  # False对应的重复的值,注意前面取反了,first保留第一行,last最后一行,False全不要
df.loc[~df.duplicated(keep=''first'')]

  

  使用df.drop_duplicates(keep=''first/last''/False)删除重复的行

df.drop_duplicates(keep=''first'')

 

numpy.random.random & numpy.ndarray.astype & numpy.arange

numpy.random.random & numpy.ndarray.astype & numpy.arange

今天看到这样一句代码:

xb = np.random.random((nb, d)).astype(''float32'') #创建一个二维随机数矩阵(nb行d列)
xb[:, 0] += np.arange(nb) / 1000. #将矩阵第一列的每个数加上一个值

要理解这两句代码需要理解三个函数

1、生成随机数

numpy.random.random(size=None) 

size为None时,返回float。

size不为None时,返回numpy.ndarray。例如numpy.random.random((1,2)),返回1行2列的numpy数组

 

2、对numpy数组中每一个元素进行类型转换

numpy.ndarray.astype(dtype)

返回numpy.ndarray。例如 numpy.array([1, 2, 2.5]).astype(int),返回numpy数组 [1, 2, 2]

 

3、获取等差数列

numpy.arange([start,]stop,[step,]dtype=None)

功能类似python中自带的range()和numpy中的numpy.linspace

返回numpy数组。例如numpy.arange(3),返回numpy数组[0, 1, 2]

今天关于Numpy、Pandas、Matplotlib、Keras、scikit-learn速查表python速查表的讲解已经结束,谢谢您的阅读,如果想了解更多关于keras 和 scikit-learn 中 MLP 回归器的不同损失值和精度、numpy+pandas+matplotlib+tushare股票分析、Numpy,Pandas,Matplotlib、numpy.random.random & numpy.ndarray.astype & numpy.arange的相关知识,请在本站搜索。

本文标签: