1. 程式人生 > >python資料分析與挖掘專案實戰記錄

python資料分析與挖掘專案實戰記錄

 python資料探勘專案實戰記錄

取自《Python資料分析與挖掘實戰》一書,整理各個專案中用到的資料處理方法:

  1. 資料預處理方法
  2. 建立模型方法
  3. 繪製圖形

對於分類問題:用模型分類;混淆矩陣及其繪圖;觀測其ROC曲線;
對於聚類問題:劃分類目數;獲取劃分類目中心;平行座標系描述

 (一)資料預處理的方法

在獲取資料之後,會發現一些資料值錯誤
一、填補空值
二、觀察資料分佈
三、資料清洗,使資料值都合理存在
四、資料規約,提取重要屬性
五、資料歸一化,為了使用K-Means演算法

 資料讀取

#SVM,bayes,ANN,D_Tree,等需要操作的資料是矩陣,需要
data=data.as_matrix() #將series資料轉為矩陣形式的訓練集 from numpy.random import shuffle shuffle(data) #隨機打亂資料 x_train=data_train[:,2:]*30 #將特徵放大 import pickle pickle.dump(model, open('../tmp/svm.model''wb'))# 儲存模型 model = pickle.load(open('../tmp/svm.model''rb'))# 讀取模型 #將資料儲存為固定檔案格式 pd.DataFrame(cm_train, index=range(5
),columns=range(5)).to_excel(outputfile1)

 一、拉格朗日插值法

from scipy.interpolate import lagrange
# 取數,兩個列表尾接
y = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]
y = y[y.notnull()]
res=lagrange(y.index, list(y))(n)   #輸入索引,和該列資料 n為空值下標

 二、series的內建插值法

df = pd.DataFrame(data, columns=[0
12]) df.interpolate()

 三、電量趨勢描述

繪製折線圖,觀測電量下降趨勢。

 四、資料探索describe(include=’all).T

通過資料探索,發現異常值,不合邏輯的錯誤值,如果資料集很大就可以丟棄,否則可以填充

explore = data.describe(include='all').T
explore['null'] = len(data) - explore['count']
explore = explore[['null''max''min''std']]# count,unique,top,freq,mean,std,min,50%,max等選取幾個屬性

#計算相關係數矩陣,data必須是n*n矩陣
print(np.round(data.corr(method='pearson'), 2))

 五、資料清洗

類似集合的操作,對於不合邏輯的錯誤值,設定索引,排除。

data = data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()]
index1 = data['SUM_YR_1'] != 0
index2 = data['SUM_YR_2'] != 0
index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0)
data = data[index1 | index2 | index3]

 六、屬性轉換

資料的規約就是選取有用的資料屬性,可以通過excel刪除對應列即可實現。


# 選取某列
data=data[data['TARGET_ID']==184].copy()  #獲取該條件下的資料的副本
data_group=data.groupby('COLLECTTIME')  #以時間分組

def attr_trans(x):  # 定義屬性變換函式
    #建立新的series
    result=pd.Series(index=['SYS_NAME''CWXT_DB:184:C:\\''CWXT_DB:184:D:\\''COLLECTTIME'])  #設定列標
    result['SYS_NAME'] = x['SYS_NAME'].iloc[0#獲取該屬性值,唯一
    result['COLLECTTIME'] = x['COLLECTTIME'].iloc[0#獲取該屬性值,唯一
    result['CWXT_DB:184:C:\\'] = x['VALUE'].iloc[0#獲取屬性值A
    result['CWXT_DB:184:D:\\'] = x['VALUE'].iloc[1#獲取屬性值B,等等
    return result

data_processed = data_group.apply(attr_trans)  # 逐組處理

 七、資料歸一化和標準化

使用正態分佈的標準正態分佈標準化:x-u/σ

data = (data - data.mean(axis=0)) / data.std(axis=0)  # 按列選取均值和標準差。矩陣操作

當發現數值範圍對結果影響太大,不方便運算時,將資料標準化

data=(data-data.min())/(data.max()-data.min())
data=data.reset_index()

 八、資料離散化

應用在發掘頻繁項時,需要把連續資料轉變為離散資料。

    for i in range(len(keys)):
        # 呼叫k-means演算法,進行聚類離散化
        r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]])  # 聚類中心,A
        r2 = pd.Series(kmodel.labels_).value_counts()  # 分類統計
        r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'n'])  #統計量, An

        r = pd.DataFrame(pd.concat([r1, r2], axis=1))  #聚類中心與類別數目匹配連線
        r = r.sort_values(typelabel[keys[i]])
        r.index = [1234]

        r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2)  # rolling_mean()用來計算相鄰2列的均值,以此作為邊界點。
        r[typelabel[keys[i]]][1] = 0.0  # 這兩句程式碼將原來的聚類中心改為邊界點。
        result = result.append(r.T) #轉置新增

    result = result.sort_index()  # 以Index(A,B,C,D,E,F)順序排序,儲存
    result.to_excel(processedfile)

 九、影象切割和顏色矩陣提取

1. 一階顏色矩:採用一階原點矩,反應影象的整體明暗程度
Ei=1/N * ∑(j:1-N) Pij
2. 二階顏色矩:反應影象顏色的分佈範圍
σi=(1/N *∑j:1-N (Pij-Ei)^2) ^1/2
3. 三階顏色矩:反應影象顏色分佈的對稱性

 十、時間序列演算法

利用時間序列演算法模型的流程,根據歷史資料,來預測未來的資料情況
採用時間序列演算法對模型輸入資料進行模型擬合、檢驗與檢測。依據誤差公式,計算預測值與驗證資料之間的誤差,分析其是否屬於業務接受的範圍內。
模型識別AR,MA,ARMA
平穩性檢驗,白噪聲檢驗,模型識別,模型檢驗,模型預測,模型評價,模型應用

 十一、行為分析與服務推薦

連線資料庫
系統過濾演算法為主,其他為輔。

 推薦

物品相似度:夾角餘弦;傑卡德相似係數;相關係數
熟悉基於物品的協同過濾演算法使用

# 基於物品的協同過濾演算法
def Jaccard(a, b):
    return 1.0 * (a * b).sum() / (a + b - a * b).sum()
class Recommender():
    sim = None
    def similarity(self, x, distance):
        y = np.ones((len(x), len(x)))
        for i in range(len(x)):
            for j in range(len(x)):
                y[i, j] = distance(x[i], x[j])
        return y
    def fit(self, x, distance=Jaccard):  #x傳入的是矩陣(行:物品,列:使用者)
        self.sim = self.similarity(x, distance) #計算相似度
    def recommend(self, a): #傳入預測使用者的購買記錄的矩陣.T = n * 1
        return np.dot(self.sim, a) * (1 - a)

 十二、變數選擇與灰色預測

使用Lasso函式對與處理資料變數選擇
灰色預測得到關鍵影響因素的預測值
使用神經網路對財政收入進行預測

 十三、文字預處理

#資料去重
l1 = len(data)
data = pd.DataFrame(data[0].unique()) #選取資料列進行unique()
l2 = len(data)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')
print(u'刪除了%s條評論。' %(l1 - l2))

#機械壓縮去詞,去除連續重複語料,和短句子刪除過濾較多垃圾資訊

#文字評論分詞
mycut = lambda s: ' '.join(jieba.cut(s)) #自定義簡單分詞函式
data1 = data1[0].apply(mycut)#對於讀入的資料執行分詞函式
data2 = data2[0].apply(mycut)#通過“廣播”形式分詞,加快速度。

#先將文字正負面評價分開,然後再進行LDA主題分析。COSTCM6中的情感分析做及其分類,生成正面情感和負面情感

# 正面主題分析
from gensim import corpora, models
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics=3, id2word=pos_dict)
for i in range(3):
    neg_lda.print_topic(i)  # 輸出每個主題

 (二)、模型方法

一、神經網路
二、決策樹
三、K-Means

 一、LM神經網路

API:
add(); compile(); fit(); save_weights(); predict_classrs()

from keras.models import Sequential
from keras.layers import Dense, Activation
net = Sequential()
net.add(Dense(input_dim=3, activation='relu', units=10))
net.compile(loss='binary_crossentropy', optimizer='adam',  metrics=['accuracy'])
net.fit(train[:, :3], train[:, 3], epochs=1000, batch_size=1)#傳入的是矩陣,讀取excel需要把資料.as_matrix()
net.save_weights(netfile)
predict_result = net.predict_classes(train[:, :3]).reshape(len(train))

 二、CART決策樹

API:
fit(); predict();

# 構建CART決策樹模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(train[:, :3], train[:, 3])
plt = cm_plot(test[:, 3], tree.predict(test[:, :3]))#獲取結果
plt.show()

 三、K-Means K聚類演算法

from sklearn.cluster import KMeans
import pandas as pd
inputFile = '../data/zscoreddata.xls'
data = pd.read_excel(inputFile)
kmodel = KMeans(n_clusters=5, n_jobs=4)
kmodel.fit(data)
print(kmodel.cluster_centers_)

 四、SVM支援向量機

from sklearn import svm
smodel=svm.SVC()  #建立模型
smodel.fit(x_train,y_train)  #訓練模型
res=smodel.predict(x_test)  #預測測試集

 (三)、繪製圖形

模型建立後,需要視覺化分析資料探勘的合理性,準確性等
混淆矩陣:正確與錯誤分類的情況
ROC曲線:分類方法的效能
聚類群圖:使資料值聚成n類,分析n類群體特徵

 混淆矩陣

預測準確度:RMSE;MAE
分類準確度:precesion=TP/TP+FP :表示使用者對推薦產品感興趣的可能性
recall=TP/(TP+FN) :表示推薦的產品,佔用戶喜歡產品的概率

from sklearn.metrics import confusion_matrix  # 匯入混淆矩陣函式
cm = confusion_matrix(y, yp)  # 混淆矩陣如下
# CM [[TP,FP],[FN,TN]]
#例如['TP', 'FP', 'FN', 'TN'] == [46, 2, 7, 4]

cm_train = confusion_matrix(train_label, smodel.predict(trainSet))
cm_test = confusion_matrix(test_label, smodel.predict(testSet))
pd.DataFrame(cm_train).to_excel(outFile1)
pd.DataFrame(cm_test).to_excel(outFile2)

 ROC曲線

from sklearn.metrics import roc_curve  # 匯入ROC曲線函式
fpr, tpr, thresholds = roc_curve(test[:, 3], tree.predict_proba(test[:, :3])[:, 1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label='ROC of CART', color='green')  # 作出ROC曲線

 聚類群圖

import matplotlib.pyplot as plt
centers = kmodel.cluster_centers_
for i in range(5):
    plt.plot([246810], centers[i], label='group' + str(i),marker='o')  #設定橫軸縱軸分別對應5個點
plt.ylabel('values')
plt.xlabel('index: L R F M C')
plt.show()

 層次聚類譜圖

import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage,dendrogram
#這裡使用scipy的層次聚類函式

Z = linkage(data_udf, method = 'ward', metric = 'euclidean'#譜系聚類圖
P = dendrogram(Z, 0#畫譜系聚類圖
plt.show()