做推薦系統 細節記錄

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 基本除法運算和模運算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章