Graphlab是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架,是一个非常强大的机器学习库,graphlab必须要在python2.0的环境下运行,安装也比较麻烦,大家可以参考关于graphlab安装的文档。
这里我们以kaggle的一个比赛:对IMDB影评进行情感分类为例,看看用graphlab如何进行情感分类。
数据下载:链接:https://pan.baidu.com/s/1Iwr4UrYx-pvCimVFuVrlmg 提取码:7esk
了解一下graphlab做情感分类的机制:基于词袋模型
词袋模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,使用一组无序的单词(words)来表达一段文字或一个文档。
词袋模型的逻辑:
1、为整个文档集(包含了许多的文档)上的每个单词创建一个唯一的标记。
2、为每个文档构建一个特征向量,主要包含每个单词在文档上的出现次数。
3、用词频矩阵作为每个样本的特征来训练分类器。
具体代码如下
# 导入所需要的库
import graphlab as gl
from IPython.display import display
from IPython.display import Image
# kaggle上下载的数据集
traindata_path = "F:/carman/kaggle_popcorn_data/labeledTrainData.tsv"
testdata_path = "F:/carman/kaggle_popcorn_data//testData.tsv"
# 打开文件
movies_reviews_data = gl.SFrame.read_csv(traindata_path,header=True,
delimiter='\t',quote_char='"',
column_type_hints = {'id':str,
'sentiment' : str,
'review':str } )
输出内容格式如下:(# 1代表正面评论,0代表负面评论)
建立词袋模型分类器
#建立词{word:fre}词典
movies_reviews_data['1grams features'] = gl.text_analytics.count_ngrams(movies_reviews_data ['review'],1)
# return An SArray of dictionary type, where each key is the n-gram string and each value is its count
# 随机划分训练集和测试集(80%训练集,20%测试集)
train_set, test_set = movies_reviews_data.random_split(0.8, seed=5)
# Automatically create a suitable classifier model based on the provided training data.
# 基于训练集的特征自动创建分类器
model_1 = gl.classifier.create(train_set, target='sentiment', \
features=['1grams features'])
result1 = model_1.evaluate(test_set)
## 检验效果
def print_statistics(result):
print "*" * 30
print "Accuracy : ", result["accuracy"]
print "Confusion Matrix: \n", result["confusion_matrix"] # 混淆矩阵/误差矩阵
print_statistics(result1)
提升分类效果
这里的逻辑在于词袋模型存在缺陷,在上面词袋模型中,我们是使用单个的单词来构建词向量,这样的序列被称为1元组(1-gram)模型。但是有的时候词连在一块是由具体含义的,因此要想提升效果,我们可以增加额外的特征,考虑词出现的顺序,建立N-gram模型
movies_reviews_data['2grams features'] = gl.text_analytics.count_ngrams(movies_reviews_data['review'],2)
train_set, test_set = movies_reviews_data.random_split(0.8, seed=5)
model_2 = gl.classifier.create(train_set, target='sentiment', features=['1grams features','2grams features'])
result2 = model_2.evaluate(test_set)
print_statistics(result2)
现在来用kaggle的测试集做验证,看看得分是多少?
traindata_path = "F:/carman/kaggle_popcorn_data/labeledTrainData.tsv"
testdata_path = "F:/carman/kaggle_popcorn_data//testData.tsv"
#creating classifier using all 25,000 reviews
train_data = gl.SFrame.read_csv(traindata_path,header=True, delimiter='\t',quote_char='"',
column_type_hints = {'id':str, 'sentiment' : int, 'review':str } )
train_data['1grams features'] = gl.text_analytics.count_ngrams(train_data['review'],1)
train_data['2grams features'] = gl.text_analytics.count_ngrams(train_data['review'],2)
cls = gl.classifier.create(train_data, target='sentiment', features=['1grams features','2grams features'])
#creating the test dataset
test_data = gl.SFrame.read_csv(testdata_path,header=True, delimiter='\t',quote_char='"',
column_type_hints = {'id':str, 'review':str } )
test_data['1grams features'] = gl.text_analytics.count_ngrams(test_data['review'],1)
test_data['2grams features'] = gl.text_analytics.count_ngrams(test_data['review'],2)
#predicting the sentiment of each review in the test dataset
test_data['sentiment'] = cls.classify(test_data)['class'].astype(int)
#saving the prediction to a CSV for submission
test_data[['id','sentiment']].save("F:/carman/kaggle_popcorn_data/predictions.csv", format="csv")
最后得分为:
We then submitted the predictions.csv file to the Kaggle challange website and scored AUC of about 0.88.
graphlab的分类器构建比较简单,效果也还不错。