Sim*_*ely 5 python algorithm artificial-intelligence machine-learning scikit-learn
因为我正努力学习这些概念,所以我将把最大的赏金放在这上面!我试图在逻辑回归中使用一些排名数据.我想用机器学习来制作一个关于网页是否"好"的简单分类器.这只是一次学习练习,所以我不指望取得好成绩; 只是希望学习"过程"和编码技巧.
我把我的数据放在.csv中如下:
URL WebsiteText AlexaRank GooglePageRank
Run Code Online (Sandbox Code Playgroud)
在我的测试CSV中,我们有:
URL WebsiteText AlexaRank GooglePageRank Label
Run Code Online (Sandbox Code Playgroud)
标签是二进制分类,表示"好",1表示"坏",0表示"坏".
我目前只使用网站文本运行我的LR; 我运行TF-IDF.
我有两个问题需要帮助.我将在这个问题上给予最大的赏金并将其授予最佳答案,因为这是我想要的一些好帮助,所以我和其他人可以学习.
1-10,000
.他们排在整个互联网之外,所以虽然http://www.google.com
可能排名#1
,但
http://www.notasite.com
可能会排名#83904803289480
.如何在Scikit中对此进行规范化,以便从我的数据中获得最佳结果?我正以这种方式运行Logistic回归; 我几乎可以肯定我做错了.我正在尝试在网站文本上执行TF-IDF,然后添加其他两个相关列并适合Logistic回归.如果有人能够快速验证我是否正在接受我要在LR中使用的三列,我会很感激.关于如何提高自己的任何和所有反馈也将在这里受到赞赏.
loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter=' ')
print "loading data.."
traindata = list(np.array(p.read_table('train.tsv'))[:,2])#Reading WebsiteText column for TF-IDF.
testdata = list(np.array(p.read_table('test.tsv'))[:,2])
y = np.array(p.read_table('train.tsv'))[:,-1] #reading label
tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents='unicode', analyzer='word',
token_pattern=r'\w{1,}', ngram_range=(1, 2), use_idf=1, smooth_idf=1,sublinear_tf=1)
rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, C=1, fit_intercept=True, intercept_scaling=1.0, class_weight=None, random_state=None)
X_all = traindata + testdata
lentrain = len(traindata)
print "fitting pipeline"
tfv.fit(X_all)
print "transforming data"
X_all = tfv.transform(X_all)
X = X_all[:lentrain]
X_test = X_all[lentrain:]
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X, y, cv=20, scoring='roc_auc'))
#Add Two Integer Columns
AlexaAndGoogleTrainData = list(np.array(p.read_table('train.tsv'))[2:,3])#Not sure if I am doing this correctly. Expecting it to contain AlexaRank and GooglePageRank columns.
AlexaAndGoogleTestData = list(np.array(p.read_table('test.tsv'))[2:,3])
AllAlexaAndGoogleInfo = AlexaAndGoogleTestData + AlexaAndGoogleTrainData
#Add two columns to X.
X = np.append(X, AllAlexaAndGoogleInfo, 1) #Think I have done this incorrectly.
print "training on full data"
rd.fit(X,y)
pred = rd.predict_proba(X_test)[:,1]
testfile = p.read_csv('test.tsv', sep="\t", na_values=['?'], index_col=1)
pred_df = p.DataFrame(pred, index=testfile.index, columns=['label'])
pred_df.to_csv('benchmark.csv')
print "submission file created.."`
Run Code Online (Sandbox Code Playgroud)非常感谢您的所有反馈 - 如果您需要任何进一步的信息,请发布!
我想sklearn.preprocessing.StandardScaler
这将是你想要尝试的第一件事.StandardScaler将您的所有功能转换为Mean-0-Std-1功能.
AlexaRank
将保证在0附近传播并且有限.(是的,即使是大量的AlexaRank
值83904803289480
也会转换为小的浮点数).当然,结果不会是1
和之间的整数,10000
但它们将保持与原始排名相同的顺序.在这种情况下,保持等级有界和标准化将有助于解决您的第二个问题,如下所示.83904803289480
.在这种情况下,Alexa Rank变量支配你的LR拟合,TF-IDF值的微小变化对LR拟合几乎没有影响.现在有人可能认为系数应该能够调整到小/大值以解释这些特征之间的差异.不是在这种情况下---不仅重要的变量的大小,而且它们的范围.Alexa Rank绝对有很大的范围,在这种情况下肯定会主导你的LR适合.因此,我认为使用StandardScaler对所有变量进行标准化以调整其范围将改善拟合.以下是如何缩放X
矩阵的方法.
sc = proprocessing.StandardScaler().fit(X)
X = sc.transform(X)
Run Code Online (Sandbox Code Playgroud)
不要忘记使用相同的缩放器进行转换X_test
.
X_test = sc.transform(X_test)
Run Code Online (Sandbox Code Playgroud)
现在您可以使用拟合程序等.
rd.fit(X, y)
re.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)
有关sklearn预处理的更多信息,请查看此内容:http://scikit-learn.org/stable/modules/preprocessing.html
编辑:解析和列合并部分可以使用pandas轻松完成,即,不需要将矩阵转换为列表然后附加它们.此外,pandas数据帧可以通过其列名直接编入索引.
AlexaAndGoogleTrainData = p.read_table('train.tsv', header=0)[["AlexaRank", "GooglePageRank"]]
AlexaAndGoogleTestData = p.read_table('test.tsv', header=0)[["AlexaRank", "GooglePageRank"]]
AllAlexaAndGoogleInfo = AlexaAndGoogleTestData.append(AlexaAndGoogleTrainData)
Run Code Online (Sandbox Code Playgroud)
请注意,我们将header=0
参数传递给read_table以维护tsv文件中的原始标头名称.还要注意我们如何使用整个列进行索引.最后,您可以叠加使用这个新的矩阵X
使用numpy.hstack
.
X = np.hstack((X, AllAlexaAndGoogleInfo))
Run Code Online (Sandbox Code Playgroud)
hstack
水平组合两个多维阵列状结构,只要它们的长度相同.