RStudio içinde Python Kullanmak


RStudio harika bir araç. Özellikle değişkenleri canlı olarak göstermesi, grafik ve yardım paneli ile vazgeçilmez bir veri bilim aracı. Bu aracın tam bir Python muadili yoktu, Python ile analizler için. Gerek de kalmadı. RStudio’nun son sürümlerinde Python ile analizleri gerçekleştirmek mümkün. Bunun için `reticulate` adlı bir R kütüphanesini import etmek gerekiyor. Gerisi şöyle:

R Markdown içerisinde python kullanıyoruz.

SVM Algoritması Örneği


Aşağıda SVM (Support Vector Machine) adlı makine öğrenmesi modeli ile yapay zeka adlı arkadaşa, mütevazı bir tahmin işlemi yaptıracağız. Bunun için Python ve SkLearn kütüphanesi ile aşağıda gördüğünüz şekildeki bir veri seti kullanıyoruz.

yasegitim_seviyesikredi_odememezlikrenk
5060green
6050green
7060green
5550green
5340green
5060green
5250green
5050green
4960green
5340green
5750green
2511red
3031red
4521red
2231red
3021red
3331red
2641red
2421red
Kredi ödememezlik tablosu

Yaş ve eğitim düzeyi bilgisi elimizdedir. Bu bilgilere göre bir de kredi geri ödeme durumunu biliyoruz.In [102]:

import pandas as pd
df = pd.read_excel('svm_ornek_data_1.xlsx')

In [115]:

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

In [111]:

df.sample(3)

Out[111]:

yasegitim_seviyesikredi_odememezlikrenk
134521red
16050green
65250green

Aşağıdaki grafikte dikkat ettiyseniz kredi geri ödememe durumu 0 olan (yani geri ödeyenler) eğitim düzeyi ve yaş yüksek kişiler. Diğerleri ise tam tersi düşük eğitimli ve genç kişiler.In [112]:

%matplotlib inline
import matplotlib.pyplot as plt
df.plot.scatter(x='yas',y='egitim_seviyesi',c=df['renk'])

Out[112]:

<matplotlib.axes._subplots.AxesSubplot at 0x27a0b7bc0b8>

Şimdi Support Vector Machine ile bu veri setini algoritmaya öğretip, bu veri setindeki bir durumda ortaya çıkacak durumu tahmin ettirelim.In [103]:

X = df.iloc[:,0:2].values.astype(float) #ilk iki kolonu al 0, 1
y = df.iloc[:,2:3].values.astype(float)# sadece 3. kolon 

StandardScaler kullanma nedeni: SVM veri setlerinin tüm kolonlar için benzer aralıkta olduğu durumlarda daha rahat çalışır. LinearSVC kullanma nedenimiz ise bu veri setinin lineer olarak ayrılabilimesi. Elbette bu mümkün olmayabilirdi de.In [131]:

scaler = StandardScaler()
X_std = scaler.fit_transform(X)

In [143]:

# Create support vector classifier
svc = LinearSVC(C=1.0, loss="hinge")

# Train model
model = svc.fit(X_std, y)
model

Out[143]:

LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='hinge', max_iter=1000, multi_class='ovr',
     penalty='l2', random_state=None, tol=0.0001, verbose=0)

Şimdi tahmin yapalım: 51 yaşıda ve eğitim seviyesi 3 olan biri kredisini geri öder mi (0:öder, 1:Ödemez)In [144]:

model.predict([[51., 3.]])

Out[144]:

array([0.])

Hyperplane (Ayırıcı Sınır) Çizdirelim

In [146]:

# Plot data points and color using their class
color = ['black' if c == 0 else 'lightgrey' for c in y]
plt.scatter(X_std[:,0], X_std[:,1], c=color)

# Create the hyperplane
w = model.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-2.5, 2.5)
yy = a * xx - (svc.intercept_[0]) / w[1]

# Plot the hyperplane
plt.plot(xx, yy)
plt.axis("off"), plt.show();

Mavi çizgi hyperplane’mizi tanımlıyor

Modeli tanımlama Pipeline Kullanarak da olurdu, ancak grafik çizdirirken sorun yarattığından pipeline kullanmadık.In [ ]:

svm_clf = Pipeline((
("scaler", StandardScaler()),
("linear_svc", LinearSVC(C=1, loss="hinge")),
))
model = svm_clf.fit(X, y.ravel()) 
#ravel dikey array'ı yatay hale getirir. Mecburen böyle Pipeline kabul etmiyor yoksa

Metin Madenciliğinde Kullanılan TF.IDF skoru nasıl hesaplanır


Elinizde diyelim ki Suriye hakkında yazılmış bir milyon habervar. Tek tek okumayı düşünmüyorsunuz:) Bu dokümanların içinden söz gelimi İdlib hakkında geçen haberleri arayacaksınız. Hemen Ctrl+F’ye davranıyorsunuz 120806 adet kavram geliyor. Eh bunları da okuyazsınız. Peki bunların içinden en ilgili olanı okumak isterseniz ne yaparsınız. Bir nevi kendi küçük Google’nizi yaratmanız gerekecek. İşte tam burada böyle bir durumda TF.IDF skoru hesaplatmak yardımınıza koşar. Nasıl yapılacağını basit bir simülasyonla şurada anlattım.

configR paketi ile R’da konfigürasyon dosyaları yazmak, okumak


Şöyle bir config dosyamız olsun, iki parametremiz var:

[max_allowed_error]
=10

[a]
=10

Bu dosyayı R’da okumak için şöyle yaparız:

library(configr)
#
config <- read.config(file="config.ini")
print(config$max_allowed_error)

Gördüğünüz gibi direkt olarak parametrlerimizi alanımıza çağırdık. Şimdi parametreleri değiştirip config.ini dosyamıza bir daha yazdıralım:

yazilacak_veriler <- list(max_allowed_error =200,a=10)
write.config(yazilacak_veriler,file="config.ini")

Bu durumda config.ini dosyamızı açınca değerlerimiz 200 ve 10 olarak görülecektir.

Bu configR paketi bizi dosya aç, oku gibi işlemler yerine config.ini dosyalarından kolayca okuma yazma yapmamızı sağlar.

INI formatı yerine YAML formatı

Daha pratik olan yaml formatını da kullanabilirsiniz

library(configr)
config <- read.config(file="config.ini",file.type = "yaml")
print(config)

yazilacak_veriler <- list(max_allowed_error =200,starting_id=10)
write.config(yazilacak_veriler,file="config.ini",write.type = "yaml")

Sadece Tek Değişkeni Değiştirikten Sonra Dosyaya Yazmak

Yukarıda her write işleminde tüm değişkenleri yeniden yazmamız gerekirdi, ama aşağıdaki gibi liste parametresini yukarıda tanımlayarak tekli parametre güncellemesinden sonra bunu konfigürasyon dosyasına yazdırabiliriz.

library(configr)

yazilacak_veriler <- list(a=10,b=20)

#ilk yazma
write.config(yazilacak_veriler,file="deneme.yaml",write.type = "yaml",)

config <- read.config(file="deneme.yaml",file.type = "yaml")
print(config)

#sadece tek değişkeni editleme
yazilacak_veriler[['a']] = 10000
write.config(yazilacak_veriler,file="deneme.yaml",write.type = "yaml",)

RCrawler ile Web Crawling İşlemi


Metin madenciliği yapabilmek için elde büyük miktarda verinin olması gereklidir. Bu miktardaki veriyi ancak ya hazır bulmak ya da web scraping adını verdiğimiz yöntemlerle web sayfalarından derlemek durumundayız. Bu durumda ise Python için kullanılacak scrapy, ve python selenium gibi kütüphanelerin yanında R için Rvest ve scrapeR gibi kütüphaneler bulunmaktadır.

R için Rcrawl adlı bir kütüphane daha bulunmaktadır. Bu kütüphaneyi yeni keşfettim. RCrawl kütüphanesinin diğerlerinden temel farkı scraping işleminde sayfa içerisinde scrape edilecek elementlerin yerlerini CSS veya XPath ile belirleme ihtiyacının olmaması. Bu durum sayfa içinde “iğne” arama külfetinden kurtarıyor. Ayrıca çok ama çok daha kısa kod ile scraping yapmayı sağlıyor.

library(Rcrawler)
Rcrawler(Website = "https://www.sayfa_adi.com/lg-mobile", 
                    no_cores = 4, 
                    no_conn = 4, 
                    crawlZoneCSSPat = c("#gridListView",".pagination"))

ASlında sadece web sayfasını parametre olarak versek de crawler sayfaları derlemeye ve bir klasöre atmaya başlıyor. Ancak bu kütüphanenin (şu adresteki https://github.com/salimk/Rcrawler ) dokümantasyonunda gördüğüm çok iyi özellikler var. Bunlardan en önemlisi no_cores ve no_conn parametreleri bu parametreler aynı anda birden fazla scraping bağlantısı ile hızı arttırıyor.

Bu crawler epey agresif. Sayfada bulduğu her bağlantıyı açarak o bağlantıyı ve altındaki bağlantıları da alıyor. Bu durum daha sonra baş edilmesi güç miktarda ilgili ilgisiz verinin gelmesine neden olabilir. Bunu engellemek için crawlZoneCSSPat parametresi mevcut, bu parametre saydada sadece ilgili CSS selectorü ile tanımlı yerdeki linkleri (mesela haber linki, yorumlar vs.) açıyor, sayfadaki diğer ilgisiz linklere izin vermiyor.

Kütüphane dokümantasyonunda ayrıca URL parametresi ile filtreleme, proxy ekleme, sadece belli bir url listesini indirme gibi özelliklerin yanında sayfalar arası bağlantıları network grafiği ile gösterme gibi harika özellikler de mevcut.

Keyifli kullanımlar…

Artık Script Src denerek Javascript Yazılmıyor


npm ile ilgili görsel sonucu"

Normalde Javascript ile işimiz olduğunda ne yapardık? Eski web uygulama geliştiricileri hatırlayacaklardır. Hatta bir çok genç geliştirici de halen eski yöntemleri sürdürmeye devam ediyor. Çünkü çalışıyor. Nedir bu yöntem:

<script src="kutuphane_1"/>
<script>
//Buraya işlerimizi kodlarız
</script>

Bu kodları HTML dosyamıza koyarız ve çalışır. Buraya kada problem yok. Sonra ne olur, yeni kütüphaneler ekleriz ve scriptlerimiz şöyle olur

<script src="kutuphane_1"/>
<script src="kutuphane_2"/>
<script src="kutuphane_3"/>
<script src="kutuphane_4"/>
<script src="kutuphane_5"/>
<script src="kutuphane_6"/>



<script>
//Buraya işlerimizi kodlarız
</script>

Çorba Hazır!

İşte hikaye ondan sonra başlar, kütüphaneler çakışır, karışır, kodları düzenlerken bilerek bilmeyerek silinir (Ertan abi….!)

Ondan sonra insanlar Javascript’e sövmeye başlar ve Javascript ile harika şekilde halledilebilecek işleri bile garibim sunucu tarafına C#’a veya Java’ya yaptırır.

Oysa kurallar değişmiştir. npm denen mucizevi paket yöneticisi icat olmuş, insanlar aya çıkmıştır ama bir çok kişi bunu görmezden gelmektedir. Haksız sayılmazlar, çünkü sinsi sinsi yayılıp yüzbinden fazla paketi artık bünyesinde barındırmaktadır npm.

NPM nedir?

Visual Studio kullananlar nuget’i, Python kullananlar pip’i, Linux kullananlar apt-get’i bilirler. Komut satırına şunu getir, bunu kur, bunu güncelle deriz. Bu tür araçlar “konsol üzerinden paketlerimizi kurmamıza olanak verir.”

NPM ya da npm.js ise Javascript kütüphanelerinin tamamını barındıran evrensel bir yerdir. Bu kütüphane yardımı ile yukarıdaki gibi eski usülde “srcipt src” satırlarını şiir gibi dizmezsiniz, lazım olanlarını “npm install” komutu yardımı ile indirir, daha sonra browserify adlı araç yardımı ile (elbette bu da bir npm paketidir) hepsini tek bir “bundle.js” dosyasına sıkıştırır ve sayfanızdan sadece tek bir “bundle.js” dosyası çağırırsınız. Tüm paketler güvenle bir arada olur. Her seferinde bu birleştirme işleminini yapmamak için ise watchify adlı paket kullanabilirsiniz. Bu ise sizin ayrı ayrı javascriptlerinizi her kaydedişte otomatik birleştirir.

Haydi Deneyelim

  • Linux kullanıyorsanız “sudo apt-get install npm” komutu ile windows kullanıyorsanız önce ilgili programı kurun. https://www.npmjs.com/get-npm
  • Konsolu açın ve npm yazıp enter’a basın. Eğer çalışırsa npm kurulmuştur.
  • Boş bir klasör açın ve cd komutu ile içine girin
  • Konsolda bu klasörde iken “npm init” komutunu verin.
  • Bu komut bu klasörde package.json adlı paket envanterini yaratır. Bu bir nevi kuracağınız her paketin otomatik olarak listeleneceği yerdir.
  • Şimdi javascript birleştirme aracı browserify’i kurmak için şu komutu verin: npm install -g browserify
  • Klasöre göz atınca node_modules adlı klasör oluştuğunu görürsünüz bu otomatik inen paketlerdir.
  • Şimdi ise denemek için hesap makinesi kütüphanesi olan arithmetic adlı kütüphaneyi indirelim. Bunun için ise npm install –save arithmetic komutunu kullanırız. Burada save parametresi paketin adını daha önce oluşturduğumuz package.json dosyasına yazar.
  • Her şey hazır, şimdi direkt olarak newway.js diye bir dosya oluşturup içerisine aşağıdaki kodları yazalım:
 var arithmetic = require('arithmetic');
 var x = arithmetic.add(2,4);
 console.log("---merhaba---");
 console.log(x);
  • Şimdi ne oluyor diyebilirsiniz? Bu kodları ayrı bir dosyaya yazdık. Bu kodlardaki arithmetic nesnesi için daha önce duymadığımız ‘require’ fonksiyonunu kullandık. Bu yeni Javascript’çenin importu demek.
  • Şimdi browserify yardımı ile bu javascriptimizi sıkıştıracağız.
  • Bunun için konsola: browserify newway.js -o bundle.js Normalde bu zorunlu değildir ancak olması faydalıdır. Bu komut sonrasında bundle.js adlı bir dosyamız oluşur.
  • Şimdi index.html dosyasını açık sadece <script src="bundle.js"> diyerek dosyamızı çağırabiliriz.

Ne Yaptık, Ne Fark Var?

Normalde bu işlem için önce gidip artihmetic kütüphanesini bulup dosyasını indirip daha sonra bu dosyayı “script src” ile html dosyamıza çağıracaktık. Sonra da kendi yazdığımız (içinnde merhaba yazan) newway.js dosyamızı oluşturacaktık, ortada iki js dosyası ve html içinden çağrılan iki js referansı olacaktı. Bu daha fazla js için daha fazla iş demekti.

Yeni yöntemdeki senaryoda ise tek js dosyası mevcut, ayrıca kütüphaneleri indirmek için sitesine gitmek gerekmiyor.

Buna Değer Mi?

npm paketlerini şuradan inceleyebilirsiniz: https://www.npmjs.com/search?q=keywords:packages

Bu paketlerin içersinde daha önce javascript’e yaptırmadığınız onlarca işlevi barındıran süper paketler var. Örneğin resim işlemeden Json içinden sorgu yapmaya, tarihleri şekillendirmeden (moment.js), yapay zeka ile resim tanıma kütüphanelerine kadar “ücretsiz” yüzbinlerce kütüphane var. Emeğinize değer.

Evet bu yazıyı buraya kadar okumuş pek az kişi olacağını biliyorum, o parmaklar ekrandaki yazıları kaydırırken bir çok fırsat kaçıyor 🙂 Buraya kadar okuduysanız da “ehemm” diyip bu yazıyı unutup eski alışkanlıklarınızla kod yazmaya devam edebilirsiniz. Ama konfor zonda kalmak, ilkelliğe razı olmaktır. Daha sonra javascript çakışmaları yaşadığınızda bu yazıyı hatırlayacaksınız:)

Daha detaylı İngilizce bir yazı için: https://medium.com/jeremy-keeshin/hello-world-for-javascript-with-npm-modules-in-the-browser-6020f82d1072

Beğendiniz mi?

SQL Server Manager’de Tüm Tabloları ve Tablo Adlarını Arama Motoru


SQL Server’da çok fazla sayıda tablo ile uğraşıyorsanız bu tabloları aramak bazen zor olabilir. SQL Server içinde tabloları aramak için bir araç yok. Bunun için SQL Server Search adlı bir eklenti mevcut. Bu eklenti ile yazdığınız bir terimi tüm tablo adlarında ve tabloların içindeki kolon adlarında bulup isterseniz sizi direkt o tabloya yönlendiriyor.

SQL Search Eklentisinin adresi: https://www.red-gate.com/products/sql-development/sql-search/