做推荐系统 细节记录

1.groupby 之后的对象转换为Dataframe   

object.reset_index()

2.替换指定数值 df.A = df.A.map({'F': '000', 'S': '001'})
3.DataFrame.to_dict(orient='')

            dict (default) : dict like {column -> {index -> value}}

            list : dict like {column -> [values]}

            series : dict like {column -> Series(values)}

            split : dict like {index -> [index], columns -> [columns], data -> [values]}

            records : list like [{column -> value}, ... , {column -> value}]

            index : dict like {index -> {column -> value}}
4.pandas.DataFrame 相互转换 spark.DataFrame
    sc = SparkContext()   
    # pandas.DataFrame =》 spark.DataFrame
    sqlContest = SQLContext(sc)  
    spark_df = sqlContest.createDataFrame(×)  
    #  spark.DataFrame =》 pandas.DataFrame
    pandas_df =×.toPandas()
4.data=data['A'].groupby([data['B'], data['C']]).sum() 以BC列两层分组对A进行组内求和,就变成了独一无二的BC组合
  data=data.reset_index()
5.判断一个List是否为空
    if len(mylist):
    由于一个空 list 本身等同于 False,所以可以直接:
    if mylist:

6.避免中文乱码:
    
    经验一:在开头声明:
    # -*- coding: utf-8 -*-
    # coding:utf-8
    经验二:遇到字符(节)串,立刻转化为unicode,不要用str(),直接使用unicode()
    unicode_str = unicode('中文', encoding='utf-8')
    print unicode_str.encode('utf-8')
    经验三:如果对文件操作,打开文件的时候,最好用codecs.open,替代open
    import codecs
    codecs.open('filename', encoding='utf8')
7.双重选择 & and 都不行
        data[data['user']==i][data['item']==j]
8.筛选某列中含有某些值的行
    a1[a1['one'].isin(['2','3'])] 列one中的值包含'2','3'的所有行。
9.在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,

如str1.decode('gb2312'),表示将gb2312编码的字符串转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,

如str2.encode('gb2312'),表示将unicode编码的字符串转换成gb2312编码。
    

10.

返回某值在Series中的索引series,然后用list()或者tolist()方法把series转换成list,然后对于list中没有重复的value的时候,然后用list.index(value)可以返回value在list中的索引值,有重 复value的话就会返回第一个索引值

11.pyspark.sql.SparkSession  spark2.0以后加入,更加符合dataframe的规范,分装了rdd.合并了SparkContext和SQLContext
    spark = SparkSession.builder.master("local") .appName("data").getOrCreate()
    下一步就可以用spark对象读取写入等
12.取某列中某个值所在整行
    df[df['列名'].isin([相应的值])] 返回该值对应的整个行
13.Series中的值按另一个Series中该值的索引对应替换  重复的字符串对象转为对应整数
    Series=Series.apply(lambda x:otherSeries.tolist().index(x))
14.spark dataframe 修改列数据的类型:
    df= df.select(df.user.cast("int"),df.item.cast("int"),df.rating.cast("int"))
15.pyspark sparksession  java.lang.StackOverflowError 递归时运行时间较长运行数量较多时   
    sparksession.sparkContext.setCheckpointDir('/home/flyvideo/PycharmProjects/xd/checkpoint/')
    als = ALS(rank=rank,maxIter=numIter, regParam=lmbda, nonnegative=True,checkpointInterval=2)
16.pyspark dataframe 保存
    从内存保存到本地

df.toPandas().to_csv('mycsv.csv')


df.write.csv('mycsv.csv')

df.write.save('×××.csv', header=True, format="csv")
df.repartition(1).write.mode('overwrite').format("com.databricks.spark.csv").option("header", "true") \.save('×××.csv')

17.嵌套映射:

    Series.apply(lambda x:map(***,x))
                 ***=lambda y:func(y)
18pandas.dataframe
    在含有中文编码的情况下
,to_csv()方法的encoding参数默认为"gbk",而read_csv()方法的encoding参数默认为"utf-8",
    所以最好的防止由于编码出错导致读取错误的方法就是在to_csv()和read_csv()方法同时显式地设置相同的encoding参数
19.调参
    a = [1,2,3]
    b = [1,2,3]
    c = [1,2]

    for aa, bb, cc in itertools.product(a, b, c):#18种组合参

20.对稀疏数据进行中心化会破坏稀疏数据的结构。但是我们可以对稀疏数据的输入进行标准化,尤其是特征在不同的标准时。MaxAbsScaler 和 maxabs_scale是专门为稀疏数据设计的,也是常用的方法。但是scale 和 StandardScaler只接受scipy.sparse的矩阵作为输入,并且必须设置with_centering=False。否则会出现 ValueError且破坏稀疏性,而且还会无意中分配更多的内存导致内存崩溃。RobustScaler不适用于稀疏数据的输入,但是你可以用 transform 方法。

21.堆内存溢出

ss.conf.set("spark.driver.memory", "2g")
ss.conf.set("spark.executor.memory", "2g")

23.栈内存溢出

ss.sparkContext.setCheckpointDir('/home/flyvideo/PycharmProjects/xd_book_rec/checkpoint/')
als=ALS(××××××××, checkpointInterval=2)
 堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。 
每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
 

  Java把内存划分成两种:一种是栈内存,一种是堆内存。

  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。

  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

  堆内存用来存放由new创建的对象和数组。

  在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

  Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

  栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

24.

StringIndexer
将一列labels转译成[0,labels基数)的index,labels基数即为labels的去重后总量,index的顺序为labels频次升序,因此出现最多次labels的index为0
IndexToString
IndexToString将index映射回原先的labels
25.显式评分矩阵显式的一些偏好信息,比如rating
    隐式评分矩阵
 
一些隐性的反馈信息,这类反馈信息没有明确地告诉某个用户对某个item的偏好信息,但是却可以从用户对某个item的交互信息中建模出来,例如一些二值特征,包括是否浏览过、是否购买过产品、以及多少次看过某部电影等等。
MLlib中提供了一种处理这类隐性特征的方法,将前面的输入ratings矩阵其实可以看做是两个矩阵:二值偏好矩阵P和信心权重矩阵C;
举个例子:假定我们的网站上面没有设计对movie的rating部分,只能通过log查看到用户是否观看过影片,然后通过后期处理,可以看出他观看到过多少次某部影片,这里P来表示影片是否被某用户看过,C来描述这里的confidence weighting也就是观看的次数, 把P和C的dot product来替代前面的rating矩阵,那么我们最终建模来预估某用户对item的偏好 26.模型性能:常用的有一些比如Mean Squared Error,Root Mean Squared Error,但是这类标准无法考量推荐最终的items的排序问题,在实际工作中用的比较多的是Mean Average Precision,考虑到了item的排序造成的影响。 27.=,浅复制,深复制copy/deepcopy 28.numpy 数组扩充 numpy数组(array)扩充(复制)方法repeat和tile的使用 29.Numpy 基本除法运算和模运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值