python創(chuàng)建分類器小結(jié)

簡介:分類是指利用數(shù)據(jù)的特性將其分成若干類型的過程。

監(jiān)督學(xué)習(xí)分類器就是用帶標(biāo)記的訓(xùn)練數(shù)據(jù)建立一個模型,然后對未知數(shù)據(jù)進行分類。

一、簡單分類器

首先,用numpy創(chuàng)建一些基本的數(shù)據(jù),我們創(chuàng)建了8個點;

X = np.array([[3, 1], [2, 5], [1, 8], [6, 4], [5, 2], [3, 5], [4, 7], [4, -1]])

給這8個點的數(shù)據(jù)賦予默認(rèn)的分類標(biāo)簽

y = [0, 1, 1, 0, 0, 1, 1, 0]
class_0 = np.array([X[i] for i in range(len(X)) if y[i] == 0])
class_1 = np.array([X[i] for i in range(len(X)) if y[i] == 1])

我們將這些數(shù)據(jù)畫出來看看

plt.figure()
# 畫散點圖 (scatterplot)
plt.scatter(class_0[:, 0], class_0[:, 1], color='black', marker='s')
plt.scatter(class_1[:, 0], class_1[:, 1], color='black', marker='x')
plt.show()
image.png

如果我們要對數(shù)據(jù)加以區(qū)分,怎么做呢?讓我們增加一條直線,我們用數(shù)學(xué)公式y(tǒng)=x畫出一條直線,構(gòu)成我們的簡單分類器;

line_x = range(10)
line_y = line_x
plt.plot(line_x, line_y, color='black', linewidth=3)
plt.show()
image.png

二、邏輯回歸分類器

邏輯回歸雖然名字叫回歸,但是其實是一種分類方法,常用于二分類。

邏輯回歸利用Sigmoid函數(shù)做了分類轉(zhuǎn)換,將結(jié)果轉(zhuǎn)換成0和1兩類,利用這個性質(zhì)實現(xiàn)了分類的功能。
image.png

Sigmoid函數(shù)是一個S型的函數(shù),當(dāng)自變量z趨近正無窮時,因變量g(z)趨近于1,而當(dāng)z趨近負(fù)無窮時,g(z)趨近于0,它能夠?qū)⑷魏螌崝?shù)映射到(0,1)區(qū)間,使其可用于將任意值函數(shù)轉(zhuǎn)換為更適合二分類的函數(shù)。

image.png

下面總結(jié)如何用python實現(xiàn)邏輯回歸。

首先導(dǎo)入需要的包,包括numpy(計算),matplotlib(畫圖), sklearn(建模)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn import linear_model

獲取鳶尾花數(shù)據(jù)集(sklarn中自帶數(shù)據(jù)集),指定特征x和目標(biāo)y,查看數(shù)據(jù)的前10行

iris = datasets.load_iris()
x = iris.data[:, :2]
y = iris.target
print('x前10行:\n', x[:10])
print('y前10行:\n', y[:10])
image.png

畫圖查看數(shù)據(jù)的分布情況,c=y表示使用顏色的順序,用y中的不同個數(shù)來定義不同顏色的數(shù)量,這里y總共有3類,所以有3種不同的顏色。

plt.figure()
plt.scatter(x[:, 0], x[:, 1], c=y)
plt.show()
image.png

初始化邏輯回歸分類器,用sklearn中的LogisticRegression模型(簡稱LR)。其中的重要參數(shù)包括, solver 設(shè)置求解系統(tǒng)方程的算法類型, C表示正則化強度,值越小正則化強度越高

clf = linear_model.LogisticRegression(solver='liblinear', C=1000)

訓(xùn)練分類器,直接用fit方法,傳入特征x和目標(biāo)y

clf.fit(X, y)

畫出數(shù)據(jù)的邊界。首先定義圖形的取值范圍,通常是從最小值到最大值,增加了一些余量(buffer),如代碼中最小值-1,最大值+1。

畫邊界的時候用到了網(wǎng)格(grid)數(shù)據(jù)求解方程的值,然后把邊界畫出來。

np.c_方法是按行連接兩個矩陣,要求兩個矩陣的行數(shù)相等。(擴展一下,同理,np.r_ 方法就是按列連接兩個矩陣,要求兩個矩陣的列數(shù)相等)

x_min, x_max = min(X[:, 0]) - 1.0, max(X[:, 0]) + 1.0
y_min, y_max = min(X[:, 1]) - 1.0, max(X[:, 1]) + 1.0
print('x_min:', x_min, 'x_max:', x_max)
print('y_min:', y_min, 'y_max:', y_max)
# 設(shè)置網(wǎng)格步長
step_size = 0.05
# 定義網(wǎng)格
x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max, step_size))
# 展平,連接
x_, y_ = np.c_[x_values.ravel(), y_values.ravel()][:, 0], np.c_[x_values.ravel(), y_values.ravel()][:, 1]
print('x_: \n', x_)
print('y_: \n', y_)

查看x_min, x_max 和 y_min, y_max的分布情況:

image.png

查看x_ 和 y_ 的數(shù)據(jù):

image.png

用分類器預(yù)測所有點的分類結(jié)果

y_pred = clf.predict(np.c_[x_.ravel(), y_.ravel()]).reshape(x_.shape)
print(y_pred)

查看預(yù)測結(jié)果:

image.png

用matplotlib畫出各個類型的邊界:

cmap_light = ListedColormap(['#AAAAFF','#AAFFAA','#FFAAAA'])
plt.figure()
plt.pcolormesh(x_, y_, y_pred, cmap=cmap_light)
plt.xlim(x_.min(), x_.max())
plt.ylim(y_.min(), y_.max())
plt.show()
image.png

更多的顏色選擇可以從顏色清單中找到:https://matplotlib.org/2.0.2/examples/pylab_examples/colours.html

再把訓(xùn)練的數(shù)據(jù)點也畫到圖上:

plt.scatter(x[:, 0], x[:, 1], c=y)
image.png

我們把參數(shù)C(對錯誤的懲罰值)調(diào)整一下,設(shè)置成1,看看效果

clf = linear_model.LogisticRegression(solver='liblinear', C=1)
image.png

可以看到,分類的效果沒有之前的那么好,很多的綠色區(qū)域的分類都錯誤了。

我們可以總結(jié),隨著參數(shù)C的不斷增大,分類錯誤的懲罰值越高,因此,各個類型的邊界更優(yōu)。

三、樸素貝葉斯分類器

樸素貝葉斯是基于概率論的分類器,利用先驗概率推導(dǎo)出后驗概率,通過概率值的閾值設(shè)定來區(qū)分類別。比如將概率>=0.5的定義為類別1,概率<0.5的定義為類別0,這樣就通過概率的計算方式實現(xiàn)了分類目的。

樸素貝葉斯分為高斯貝葉斯,伯努利貝葉斯,多項式貝葉斯。不同的貝葉斯基于數(shù)據(jù)的分布不同進行選擇。

高斯貝葉斯用于正式分布的數(shù)據(jù),適用于連續(xù)數(shù)據(jù),例如溫度,高度。

伯努利貝葉斯用于二項分布的數(shù)據(jù)(例如,拋硬幣),二項分布又叫做伯努利分布。

多項式貝葉斯用于多項分布的數(shù)據(jù)(例如,擲骰子)。

下面,我們開始總結(jié)用python實現(xiàn)樸素貝葉斯的方法。

首先,導(dǎo)入需要用的包。主要是sklearn中的一些類,包括建模用到的包,構(gòu)造數(shù)據(jù)用到的包,數(shù)據(jù)集劃分,交叉驗證等。

from sklearn.naive_bayes import GaussianNB
from utils.views import plot_classifier, plot_confusion_matrix
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import confusion_matrix, classification_report

我們開始導(dǎo)入數(shù)據(jù),使用的是sklarn自帶的構(gòu)造數(shù)據(jù)的方法(make_classification)。

X, y = make_classification(n_samples=2000, n_features=2, n_redundant=0, n_classes=4, n_clusters_per_class=1, random_state=0)
print('X前10行數(shù)據(jù): \n', X[: 10])
print('y前10行數(shù)據(jù), \n', y[:10])

介紹一下,里面用到的常用參數(shù),包括:

n_samples: 2000個樣本

n_features:2個特征

n_redundant:冗余特征數(shù)0個

n_classes: 4個類別

n_clusters_per_class:每個簇1個類

random_state: 隨機數(shù)種子,隨便定義,確定隨機數(shù)種子后,多次反復(fù)執(zhí)行該語句,生成的數(shù)據(jù)結(jié)果是一樣的。如果不確定的話,每次生成的數(shù)據(jù)隨機。

查看數(shù)據(jù)的前10行情況:

image.png

查看一下數(shù)據(jù)的分布情況:

plt.Figure()
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()
image.png

用train_test_split對數(shù)據(jù)集進行訓(xùn)練集和測試集的劃分。

查看代碼

X_train, X_test, y_tran, y_test = train_test_split(X, y, test_size=0.25)
其中,test_size = 0.25表示測試集數(shù)據(jù)占25%,訓(xùn)練集數(shù)據(jù)占75%。

開始建立樸素貝葉斯模型。

clf = GaussianNB()

模型訓(xùn)練,傳入特征x和目標(biāo)值y,這里用的數(shù)據(jù)都是訓(xùn)練集

clf.fit(X_train, y_tran)

預(yù)測結(jié)果,傳入測試集:

y_pred = clf.predict(X_test)

將數(shù)據(jù)劃分的結(jié)果可視化

plot_classifier(clf, X_test, y_test)
def plot_classifier(clf, X, y):
    # 定義圖形取值范圍
    x_min, x_max = min(X[:, 0]) - 1.0, max(X[:, 0]) + 1.0
    y_min, y_max = min(X[:, 1]) - 1.0, max(X[:, 1]) + 1.0
    print('x_min:', round(x_min, 2), 'x_max:', round(x_max, 2))
    print('y_min:', round(y_min, 2), 'y_max:', round(y_max, 2))
    # 網(wǎng)格(grid) 數(shù)據(jù)求解方程的值,畫出邊界
    # 設(shè)置網(wǎng)格步長
    step_size = 0.01
    # 定義網(wǎng)格
    x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max, step_size))

    # 展平,連接
    x_, y_ = np.c_[x_values.ravel(), y_values.ravel()][:, 0], np.c_[x_values.ravel(), y_values.ravel()][:, 1]

    # 預(yù)測結(jié)果
    mesh_output = clf.predict(np.c_[x_values.ravel(), y_values.ravel()])

    # 數(shù)組維度變形
    mesh_output = mesh_output.reshape(x_values.shape)
    plt.figure()
    # 選擇配色方案‘
    plt.pcolormesh(x_values, y_values, mesh_output, cmap=plt.cm.gray)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=80, edgecolors='black', linewidths=1) # cmap=plt.cm.Paired

    # 設(shè)置圖形的取值范圍
    plt.xlim(x_values.min(), x_values.max())
    plt.ylim(y_values.min(), y_values.max())
    # 設(shè)置x軸與y軸
    plt.xticks((np.arange(int(min(X[:, 0]) - 1), int(max(X[:, 0]) + 1), 1.0)))
    plt.yticks((np.arange(int(min(X[:, 1]) - 1), int(max(X[:, 1]) + 1), 1.0)))
    plt.show()

和邏輯回歸時畫圖的方法一樣,借助于網(wǎng)格來確定數(shù)據(jù)的界限,這里,直接把這個過程提取成一個plot_classifier方法,每次傳入模型clf和x,y的值即可。

image.png

用肉眼查看,感覺分類結(jié)果還不錯,那么具體結(jié)果值是多少呢?我們查看一下準(zhǔn)確率,用預(yù)測結(jié)果和測試集(即真實結(jié)果)進行比對

accuracy = clf.score(X_test, y_test)
print('accuracy:---', accuracy)
image.png

可以看到準(zhǔn)確率有92%,還是不錯的。當(dāng)然這只是訓(xùn)練一次的結(jié)果,可能存在一定的偶然性,如果想讓結(jié)果更具說服力,減少數(shù)據(jù)切分帶來的偶然性,那么,我們可以使用十折交叉驗證。

image.png

十折交叉驗證即每次取訓(xùn)練集中的一份做驗證集,其余9份做訓(xùn)練集,然后取最后的結(jié)果平均值,作為最終結(jié)果的輸出。

accuracy_cv = cross_val_score(clf, X, y, scoring='accuracy', cv=10)
print('accuracy_cv:---', round(accuracy_cv.mean(), 2))

f1 = cross_val_score(clf, X, y, scoring='f1_weighted', cv=10)
print('f1:', round(f1.mean(), 4))

precision = cross_val_score(clf, X, y, scoring='precision_weighted', cv=10)
print('precision:', round(precision.mean(), 4))

recall = cross_val_score(clf, X, y, scoring='recall_weighted', cv=10)
print('recall:', round(recall.mean(), 4))

其中cv=10,表示交叉驗證10次。scoring='accuracy' 表示輸出的結(jié)果是準(zhǔn)確率,其他的參數(shù)還有,f1_weighted(f1分?jǐn)?shù)),precision_weighted(精準(zhǔn)率), recall_weighted(召回率)。

image.png

可以看到十次交叉驗證的結(jié)果準(zhǔn)確率也能達(dá)到92%,精準(zhǔn)率,召回率,f1-score也都在92%左右,表現(xiàn)還是不錯的。

我們可以通過混淆矩陣進一步查看,在哪些類別上出錯的多一些。

confusion_mat = confusion_matrix(y_test, y_pred)
print('confusion_mat: \n', confusion_mat)
plot_confusion_matrix(confusion_mat)
image.png

從矩陣中可以看出,第3類和第4類被誤判的結(jié)果稍多一些,這和從可視化的圖上看到的結(jié)果是一致的。


image.png

對于混淆矩陣,還可以進行可視化

plt.imshow(confusion_mat, interpolation='nearest', cmap='gray')   # 亮色: cmap=plt.cm.Paired
plt.title('Confusion matrix')
plt.colorbar()
tick_marks = np.arange(4)
plt.xticks(tick_marks, tick_marks)
plt.yticks(tick_marks, tick_marks)
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
image.png

從圖中,我們可以看出,對角線的顏色很亮,我們希望的是對角線的顏色越亮越好,在非對角線的區(qū)域如果全部是黑色,表示沒有錯誤;如果有灰色區(qū)域,那么表示分類錯誤的樣本量。從混淆矩陣的可視化圖中,我們可以看到下標(biāo)2(即第3類)和下標(biāo)3(即第4類)存在灰色區(qū)域,說明第3類和第4類存在分類錯誤的情況。

sklearn類還內(nèi)置了性能報告,我們可以直接用classification_report方法進行提取查看算法的分類效果。

target_names = ['Class-0', 'Class-1', 'Class-2', 'Class-3']
report = classification_report(y_test, y_pred, target_names=target_names)
print(report)
image.png

報告中最后一列support表示的是樣本數(shù),總的樣本數(shù)為2000個,我們設(shè)置了0.25比例的訓(xùn)練集,那么訓(xùn)練數(shù)就有500個,132,122,120,126則表示每一類的樣本數(shù),加起來總共也是500個。

以上,用的是高斯葉斯分類器的訓(xùn)練和預(yù)測結(jié)果,我們也可以用伯努利貝葉斯看看結(jié)果如何。

image.png
image.png
image.png

我們可以看到,對于這個數(shù)據(jù)集,第1類分錯的情況變多了,從混淆矩陣的可視化圖中,看到有灰色的矩陣出現(xiàn),從報告中看出precision從93%降低到了92%,第4類分類錯誤也變多,由92%降低到了89%。這樣導(dǎo)致整體的平均precision由92%降低到了90%,不過對于第2類的分類準(zhǔn)確率是提高了,92%提高到了98%。

四、分類器案例:根據(jù)汽車特征評估質(zhì)量

需求分析:根據(jù)汽車的特征進行訓(xùn)練,得到訓(xùn)練模型,用模型預(yù)測具體某輛汽車的質(zhì)量情況。

數(shù)據(jù)分析:

目標(biāo):「汽車質(zhì)量」,(unacc,ACC,good,vgood)分別代表(不可接受,可接受,好,非常好)

6個屬性變量分別為:

「買入價」buying:取值范圍是vhigh、high、med、low

「維護費」maint:取值范圍是vhigh,high,med,low

「車門數(shù)」doors:取值范圍 2,3,4,5more

「可容納人數(shù)」persons:取值范圍2,4, more

「后備箱大小」lug_boot: 取值范圍 small,med,big

「安全性」safety:取值范圍low,med,high

值得一提的是6個屬性變量全部是有序類別變量,比如「可容納人數(shù)」值可為「2,4,more」,「安全性」值可為「low, med, high」

查看數(shù)據(jù)分布情況:

image.png

導(dǎo)入必要的包,包括sklearn(建模,交叉驗證,學(xué)習(xí)曲線), numpy(計算), matplotlib(畫圖):

查看代碼

import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, validation_curve
import numpy as np
from utils.views import plot_curve
import pandas as pd

導(dǎo)入必要的包,包括sklearn(建模,交叉驗證,學(xué)習(xí)曲線), numpy(計算), matplotlib(畫圖):

查看代碼

import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, validation_curve
import numpy as np
from utils.views import plot_curve
import pandas as pd

加載數(shù)據(jù):

 input_file = 'data/car.data.txt'
df = pd.read_table(input_file, header=None, sep=',')
df.rename(columns={0:'buying', 1:'maint', 2:'doors', 3:'persons', 4:'lug_boot', 5:'safety', 6:'quality'}, inplace=True)
df.head(10)
image.png

將字符串轉(zhuǎn)換成數(shù)值:

label_encoder = []
for i in range(df.shape[1]):
    label_encoder.append(preprocessing.LabelEncoder())
    df.iloc[:, i] = label_encoder[-1].fit_transform(df.iloc[:, i])
df.head(10)
image.png

提取特征X和目標(biāo)值y

X = df.iloc[:, :-1]
y = df.iloc[:, -1]

接下來訓(xùn)練分類器,這里我們使用隨機森林分類器

params = {
    'n_estimators': 200,
    'max_depth': 8,
    'random_state': 7
}
clf = RandomForestClassifier(**params)
clf.fit(X, y)

接下來開始驗證模型的效果,采用十折交叉驗證。注意,用十折交叉驗證的時候就不需要做數(shù)據(jù)集的劃分,直接用全量數(shù)據(jù)集即可。

accuracy = cross_val_score(clf, X, y, scoring='accuracy', cv=10)
print('accuracy:', round(accuracy.mean(), 3))
image.png

建立分類器的目的就是對孤立的未知數(shù)據(jù)進行分類,下面對單一數(shù)據(jù)點進行分類。

input_data = ['low', 'vhigh', '2', '2', 'small', 'low']
input_data_encoded = [-1] * len(input_data)
for i, item in enumerate(input_data):
    input_data_encoded[i] = int(label_encoder[i].transform([input_data[i]]))
input_data_encoded = np.array(input_data_encoded)
print(input_data_encoded)

將單一數(shù)據(jù)由字符串類型轉(zhuǎn)換成數(shù)值類型:

image.png

預(yù)測數(shù)據(jù)點的輸出類型:

output_class = clf.predict(input_data_encoded.reshape(1, -1))
print('output class:', label_encoder[-1].inverse_transform(output_class)[0])
image.png

用predict進行預(yù)測輸出,輸出的是數(shù)值編碼,顯然是看不懂具體的含義的,需要用inverse_transform對標(biāo)記編碼進行解碼,轉(zhuǎn)換成原來的形式。

參數(shù)調(diào)優(yōu)

通過生成驗證曲線,網(wǎng)格搜索進行參數(shù)的調(diào)優(yōu)。

我們對 n_estimators(弱學(xué)習(xí)器的個數(shù)) 這個參數(shù),太小容易欠擬合,太大容易過擬合。

parameter_grid = np.linspace(25, 200, 8).astype(int)
train_scores, validation_scores = validation_curve(clf, X, y, param_name='n_estimators',
                                                   param_range=parameter_grid, cv=5)
print('\n ##### VALIDATION CURVES #####')
print('\nParam: n_estimators \n Training scores: \n', train_scores)
print('\nParam: n_estimators \n Validation scores:\n', validation_scores)
image.png

驗證曲線畫圖:

plt.figure()
plt.plot(parameter_grid, 100 * np.average(train_scores, axis=1), color='black')
plt.title('Training curve')
plt.xlabel( 'Number of estimators')
plt.ylabel('Accuracy')
plt.show()
image.png

由圖可以看出,estimate在100附近,達(dá)到最大的準(zhǔn)確率。

同理對max_depth生成驗證曲線。

max_depth_grid = np.linspace(2, 10, 5).astype(int)
train_scores, validation_scores = validation_curve(clf, X, y, param_name='max_depth',
                                                   param_range=max_depth_grid, cv=5)
plot_curve(max_depth_grid, train_scores, 'Validation curve', 'Maximum depth of the tree')
image.png

可以看出,max_depth在10附近,準(zhǔn)確率達(dá)到最大值。

生成學(xué)習(xí)曲線

學(xué)習(xí)曲線可以幫助我們理解訓(xùn)練數(shù)據(jù)集的大小對機器學(xué)習(xí)模型的影響。當(dāng)計算能力限制的時候,這點非常有用。下面改變訓(xùn)練數(shù)據(jù)集的大小,繪制學(xué)習(xí)曲線。

parameter_grid = np.array([200, 500, 800, 1100])
train_size, train_scores, validation_scores = learning_curve(clf, X, y, train_sizes=parameter_grid, cv=10)
print('\n ##### LEARNING CURVES #####')
print('\n Training scores: \n', train_scores)
print('\n Validation scores:\n', validation_scores)
plot_curve(parameter_grid, train_scores, 'Learning curve', 'Number of training samples')
image.png

可以看到訓(xùn)練的數(shù)據(jù)集規(guī)模越小,訓(xùn)練的準(zhǔn)確率越高。

但是,這樣也會容易造成一個問題,那就是過擬合。如果選擇規(guī)模較大的數(shù)據(jù)集,會消耗更多的資源,所以訓(xùn)練集的規(guī)模選擇是一個結(jié)合計算能力需要綜合考慮的問題。

以上用到數(shù)據(jù)集下載:

car.data.txt: https://url87.ctfile.com/f/21704187-595799592-6f0749?p=7287 (訪問密碼: 7287)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內(nèi)容